W tym artykule przyjrzymy się użyciu różnych formatów daty SQL CONVERT w SQL Server.
Interpretacja dat różni się w różnych krajach. Załóżmy, że masz globalną bazę danych SQL Server z tabelą zawierającą określony format daty. Na przykład ma kolumnę daty, która ma wartość 01/05/2020.
Jak to zinterpretujesz? Przyjrzyjmy się następującym interpretacjom w różnych krajach.
- USA:5 stycznia 2020 r. (Format standardowy – mm/dd/rrrr)
- Europa:1 maja 2020 r. (format standardowy – dd/mm/rrrr)
Ponadto w innych krajach obowiązują inne formaty dat:
- Turcja:dd.mm.rrrr
- Indie:dd-mm-rrrr
- Bułgaria:rrrr-m-d
- Węgry:rrrr.mm.dd.
Więcej informacji o formatach dat według kraju znajdziesz w Wikipedii.
Poza tym czasami chcemy również dołączyć znacznik czasu wraz z datami. Oto kilka przykładów:
- 01.05.2020 10:00
- 05.05.2020 14:00
- 05.05.2020 14:00
- 01.05.2020 02:00:55
Nie jest możliwe przechowywanie dat w tabeli SQL Server w różnych formatach, więc potrzebujemy sposobu na konwersję formatów dat. Przyjrzyjmy się różnym metodom formatu daty w SQL CONVERT.
SQL CONVERT funkcja daty
Zazwyczaj specjaliści ds. baz danych używają funkcji daty SQL CONVERT, aby uzyskać daty w określonym i spójnym formacie. To stosuje kody stylów dla określonych dat wyjściowych.
Składnia funkcji CONVERT():
KONWERTUJ(typ danych, data i godzina [,styl])
W poniższym zapytaniu SQL konwertujemy datę i godzinę na dwa formaty za pomocą funkcji CONVERT().
- format mm/dd/rr:kod stylu 1
- mm/dd/rrrr:kod stylu 101
DECLARE @Inputdate datetime = '2019-12-31 14:43:35.863'; Select CONVERT(varchar,@Inputdate,1) as [mm/dd/yy], CONVERT(varchar,@Inputdate,101) as [mm/dd/yyyy]
Podobnie możemy określić różne kody stylów, dzięki czemu można przekonwertować daty na wymagany format.
SELECT '0' AS [StyleCode], 'Default format' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 0) AS [OutputFormat] UNION ALL SELECT '1' AS [StyleCode], 'USA - mm/dd/yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 1) AS [OutputFormat] UNION ALL SELECT '2' AS [StyleCode], 'ANSI - dd.mm.yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 2) AS [OutputFormat] UNION ALL SELECT '3' AS [StyleCode], 'British and French - dd/mm/yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 3) AS [OutputFormat] UNION ALL SELECT '4' AS [StyleCode], 'German - dd.mm.yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 4) AS [OutputFormat] UNION ALL SELECT '5' AS [StyleCode], 'Italian - dd-mm-yy ' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 5) AS [OutputFormat] UNION ALL SELECT '6' AS [StyleCode], 'Shortened month name -dd mon yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 6) AS [OutputFormat] UNION ALL SELECT '7' AS [StyleCode], 'Shortened month name - mon dd, yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 7) AS [OutputFormat] UNION ALL SELECT '8' AS [StyleCode], '24 hour time -hh:mm:ss' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 8) AS [OutputFormat] UNION ALL SELECT '9' AS [StyleCode], 'Default + milliseconds - mon dd yyyy hh:mm:ss:mmmAM (or PM)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 9) AS [OutputFormat] UNION ALL SELECT '10' AS [StyleCode], 'USA - mm-dd-yy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 10) AS [OutputFormat] UNION ALL SELECT '11' AS [StyleCode], 'Japan -yy/mm/dd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 11) AS [OutputFormat] UNION ALL SELECT '12' AS [StyleCode], 'ISO format -yymmdd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 12) AS [OutputFormat] UNION ALL SELECT '13' AS [StyleCode], 'Europe default + milliseconds -dd mon yyyy hh:mm:ss:mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 13) AS [OutputFormat] UNION ALL SELECT '14' AS [StyleCode], ' 24 hour time with milliseconds -hh:mm:ss:mmm(24h)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 14) AS [OutputFormat] UNION ALL SELECT '20' AS [StyleCode], 'ODBC canonical -yyyy-mm-dd hh:mm:ss(24h)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 20) AS [OutputFormat] UNION ALL SELECT '21' AS [StyleCode], 'ODBC canonical (with milliseconds) -yyyy-mm-dd hh:mm:ss.mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 21) AS [OutputFormat] UNION ALL SELECT '22' AS [StyleCode], 'mm/dd/yy hh:mm:ss AM (or PM)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 22) AS [OutputFormat] UNION ALL SELECT '23' AS [StyleCode], 'ISO 8601 - yyyy-mm-dd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 23) AS [OutputFormat] UNION ALL SELECT '100' AS [StyleCode], 'mon dd yyyy hh:mmAM' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 100) AS [OutputFormat] UNION ALL SELECT '101' AS [StyleCode], 'USA -mm/dd/yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 101) AS [OutputFormat] UNION ALL SELECT '102' AS [StyleCode], 'ANSI -yyyy.mm.dd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 102) AS [OutputFormat] UNION ALL SELECT '103' AS [StyleCode], 'British/French -dd/mm/yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 103) AS [OutputFormat] UNION ALL SELECT '104' AS [StyleCode], 'German - dd.mm.yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 104) AS [OutputFormat] UNION ALL SELECT '105' AS [StyleCode], 'Italian -dd-mm-yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 105) AS [OutputFormat] UNION ALL SELECT '106' AS [StyleCode], 'Shortened month name -dd mon yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 106) AS [OutputFormat] UNION ALL SELECT '107' AS [StyleCode], 'Shortened month name -mon dd, yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 107) AS [OutputFormat] UNION ALL SELECT '108' AS [StyleCode], '24 hour time -hh:mm:ss' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 108) AS [OutputFormat] UNION ALL SELECT '109' AS [StyleCode], 'Default + milliseconds -mon dd yyyy hh:mm:ss:mmmAM (or PM) ' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 109) AS [OutputFormat] UNION ALL SELECT '110' AS [StyleCode], 'USA -mm-dd-yyyy' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 110) AS [OutputFormat] UNION ALL SELECT '111' AS [StyleCode], 'JAPAN -yyyy/mm/dd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 111) AS [OutputFormat] UNION ALL SELECT '112' AS [StyleCode], 'ISO -yyyymmdd' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 112) AS [OutputFormat] UNION ALL SELECT '113' AS [StyleCode], 'Europe default + milliseconds -dd mon yyyy hh:mm:ss:mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 113) AS [OutputFormat] UNION ALL SELECT '114' AS [StyleCode], ' 24 hour time with milliseconds -hh:mm:ss:mmm(24h)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 114) AS [OutputFormat] UNION ALL SELECT '120' AS [StyleCode], 'ODBC canonical- yyyy-mm-dd hh:mm:ss(24h)' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 120) AS [OutputFormat] UNION ALL SELECT '121' AS [StyleCode], 'ODBC canonical (with milliseconds) -yyyy-mm-dd hh:mm:ss.mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 121) AS [OutputFormat] UNION ALL SELECT '126' AS [StyleCode], 'ISO8601 -yyyy-mm-ddThh:mm:ss.mmm' AS [Standard and Format], CONVERT(VARCHAR(50), Getdate(), 126) AS [OutputFormat] UNION ALL SELECT '127' AS [StyleCode], 'ISO8601 with time zone Z-yyyy-mm-ddThh:mm:ss.mmmZ' AS [Standard and Format], CONVERT(VARCHAR(100), Getdate(), 127) AS [OutputFormat] UNION ALL SELECT '131' AS [StyleCode], 'Arabic Hijri date - Islamic calendar' AS [Standard and Format], CONVERT(VARCHAR(100), Getdate(), 131) AS [OutputFormat]
Na poniższym zrzucie ekranu możesz zobaczyć kod stylu, ich standardy, formaty i daty wyjściowe.
Konwersja dat za pomocą funkcji FORMAT()
W powyższej funkcji CONVERT() wymagane jest określenie kodów stylów dla określonego formatu wyjściowego. Zazwyczaj nie chcemy pamiętać tych kodów; dlatego Microsoft wprowadził funkcję FORMAT() w SQL Server 2012.
Składnia jest pokazana poniżej.
FORMAT (wartość, format [, kultura])
Wartość :Wymaga wartości w obsługiwanym formacie. Szczegółową listę można znaleźć w dokumentacji firmy Microsoft.
Format :W formacie możemy określić kody formatu lub wzór, aby ukryć dane wejściowe dotyczące daty. Poniższy skrypt pokazuje kody formatów, wzór i format wyjściowy.
DECLARE @InputDate DATETIME = '2020-12-08 15:58:17.643' SELECT 'd' AS [FormatCode], 'Short Date Pattern' AS 'Pattern', Format(@InputDate, 'd') AS 'Output' UNION ALL SELECT 'D' AS [FormatCode], 'Long Date Pattern' AS 'Pattern', Format(@InputDate, 'D') AS 'Output' UNION ALL SELECT 'f' AS [FormatCode], 'Full Date/Time pattern (Short Time)' AS 'Pattern', Format(@InputDate, 'f') AS 'Output' UNION ALL SELECT 'F' AS [FormatCode], 'Full Date/Time pattern (Long Time)' AS 'Pattern', Format(@InputDate, 'F') UNION ALL SELECT 'g' AS [FormatCode], 'General Date/Time pattern (Short Time)' AS 'Pattern', Format(@InputDate, 'g') UNION ALL SELECT 'G' AS [FormatCode], 'General Date/Time pattern (Long Time)' AS 'Pattern', Format(@InputDate, 'G') AS 'Output' UNION ALL SELECT 'm' AS [FormatCode], 'Month/Day pattern' AS 'Pattern', Format(@InputDate, 'm') AS 'Output' UNION ALL SELECT 'O' AS [FormatCode], 'Round trip Date/Time pattern' AS 'Pattern', Format(@InputDate, 'O') AS 'Output' UNION ALL SELECT 'R' AS [FormatCode], 'RFC1123 pattern' AS 'Pattern', Format(@InputDate, 'R') AS 'Output' UNION ALL SELECT 's' AS [FormatCode], 'Sortable Date/Time pattern' AS 'Pattern', Format(@InputDate, 's') AS 'Output' UNION ALL SELECT 't' AS [FormatCode], 'Short Time pattern' AS 'Pattern', Format(@InputDate, 't') AS 'Output' UNION ALL SELECT 'T' AS [FormatCode], 'Long Time Pattern' AS 'Pattern', Format(@InputDate, 'T') AS 'Output' UNION ALL SELECT 'u' AS [FormatCode], 'Universal sortable Date/Time pattern' AS 'Pattern', Format(@InputDate, 'u') AS 'Output' UNION ALL SELECT 'U' AS [FormatCode], 'Universal Full Date/Time pattern' AS 'Pattern', Format(@InputDate, 'U') AS 'Output' UNION ALL SELECT 'Y' AS [FormatCode], 'Year Month pattern' AS 'Pattern', Format(@InputDate, 'Y') AS 'Output'
Kultura :Jest to argument opcjonalny i definiuje kulturę. Jeśli nie określimy żadnej kultury, SQL Server używa języka bieżącej sesji.
W poniższym zapytaniu przekonwertujemy format daty na określoną kulturę. Musimy określić kod kultury. Na przykład kod kultury dla Stanów Zjednoczonych to en-US, a hi-IN to dla Indii.
Skrypty używają d kod formatu dla wzorców dat krótkich.
DECLARE @d DATETIME ='2020-12-08 16:36:17.760'; SELECT FORMAT (@d, 'd', 'en-US') AS 'US English', FORMAT (@d, 'd', 'no') AS 'Norwegian Result', FORMAT(@d, 'd', 'hi-IN') AS 'India', FORMAT(@d, 'd', 'ru-RU') AS 'Russian', FORMAT(@d, 'd', 'gl-ES') AS 'Galician (Spain)', FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English', FORMAT (@d, 'd', 'zu') AS 'Zulu', FORMAT ( @d, 'd', 'de-de' ) AS 'German', FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC)';
Otrzymasz format daty w określonej kulturze, jak pokazano poniżej.
Jeśli chcesz, aby data była wyświetlana w pełnym wzorze daty/godziny (długi czas), podaj kod formatu F, który szybko zmieni format daty.
W formacie daty możesz również określić niestandardowe formaty i konwertować ciąg daty wejściowej zgodnie z Twoimi wymaganiami.
Aby określić niestandardowe ciągi, możemy użyć następujących skrótów.
- dd:Dzień miesiąca (od 01 do 31)
- dddd:pisownia w ciągu dnia
- MM:numer miesiąca (od 01 do 12)
- MMMM:pisownia miesiąca
- yy:dwucyfrowy rok
- rrrr:czterocyfrowy rok
- hh:Jest godzina od 01 do 12
- HH:To daje 24 godziny. Formatuj godzinę 00 do 23
- mm:minuta 00 do 59
- ss:sekunda od 00 do 59
- tt:AM lub PM
W poniższym skrypcie przekonwertowaliśmy formaty danych wejściowych na wiele formatów, korzystając z powyższych skrótów lub kodów.
DECLARE @d DATETIME ='2020-12-08 16:36:17.760'; SELECT FORMAT (@d,'dd/MM/yyyy ') as [Date Format 1] , FORMAT (@d, 'dd/MM/yyyy, hh:mm:ss ') as [Date Format 2] , FORMAT(@d,'yyyy-MM-dd HH:mm:ss')as [Date Format 3] , FORMAT(@d,'Dd MMM yyyy HH:mm:ss')as [Date Format 4] , FORMAT(@d,'MMM d yyyy h:mm:ss')as [Date Format 5] , FORMAT (@d, 'dddd, MMMM, yyyy')as [Date Format 6] , FORMAT (@d, 'MMM dd yyyy') as [Date Format 7] , FORMAT (@d, 'MM.dd.yy') as [Date Format 8] , FORMAT (@d, 'MM-dd-yy') as [Date Format 9] , FORMAT (@d, 'hh:mm:ss tt')as [Date Format 10] , FORMAT (@d, 'd-M-yy')as [Date Format 11] , FORMAT(@d,'MMMM dd,yyyy')as [Date Format 12]
Korzystanie z AT TIME ZONE w SQL Server 2016 lub nowszym
Różne kraje mają różne strefy czasowe. Zazwyczaj te strefy czasowe następują po przesunięciu względem uniwersalnego czasu koordynowanego (UTC). Oto kilka przykładów stref czasowych:
- Australijski czas letni:UTC +10:30
- Indyjski czas standardowy:UTC +5:30
- Czas letni w górach:UTC-6
- Czas w Singapurze:UTC+8
- Centralny czas letni:UTC-5
W tym artykule znajdziesz szczegółową listę stref czasowych.
W wielu krajach obowiązuje czas letni, a zegar jest regulowany o 1 godzinę (lub 30-45 minut) w zależności od stref czasowych. Na przykład czas środkowoamerykański był zgodny z poniższym harmonogramem:
- Czas standardowy rozpoczął się:1 listopada 2020 r. 02:00 czasu lokalnego. Zegary zostały cofnięte o godzinę.
- Czas standardowy kończy się 14 marca 2021 r. o godzinie 02:00 czasu lokalnego. Zegary przesuną się o godzinę do przodu.
SQL Server nie zna tych stref czasowych i czasu letniego. Zwykle organizacja podąża za strefami UTC, ponieważ nie wymaga żadnych zmian.
Jak możemy przekonwertować strefy czasowe w SQL Server?
Możesz użyć AT TIME ZONE, zaczynając od SQL Server 2016 i przekonwertować strefy czasowe. W poniższym zapytaniu pokazuje daty dla Centralnego Czasu Standardowego, Czasu Standardowego Indii i Czasu Standardowego Samoa.
Declare @DateinUTC datetime2='2020-11-01 02:00:00' select @DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'Central Standard Time' as 'Central Standard Time' , @DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'India Standard Time' as 'India Standard Time', @DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'Samoa Standard Time' as 'Samoa Standard Time', @DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'Dateline Standard Time' as 'Dateline Standard Time'
Aby poznać obsługiwane strefy czasowe, możesz wysłać zapytanie sys.time_zone_info i zwraca strefę czasową i przesunięcie.
Następnie możesz filtrować strefy czasowe, które obecnie obowiązują, według czasu letniego.
Select * from sys.time_zone_info where is_currently_dst=1
Rozważmy teraz czas letni dla czasu wschodniego.
- Rozpoczął się czas letni – niedziela, 8 marca 2020 roku o godzinie 2:00.
- Czas letni zakończył się – niedziela, 1 listopada 2020 r., o godzinie 2:00.
Przekształć swoją strefę UTC na czas wschodnioamerykański standardowy i zwróć uwagę na wpływ czasu letniego.
DECLARE @PreDST datetime = '2020-03-08 06:59:00', @PostDST datetime = '2020-03-08 07:00:00'; SELECT @PreDST AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time' AS [EST time before DST], @PostDST AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time' AS [EST time before DST];
Przydatne punkty dotyczące używania formatów daty SQL CONVERT
Oceń wymagania aplikacji i wybierz datę odpowiedniego typu danych, SmallDateTime, DateTime, DateTime2 i DateTimeOffset.
Format daty można przekonwertować za pomocą funkcji SQL CONVERT data i FORMAT; jednak zaleca się użycie formatu, który najlepiej odpowiada Twoim obciążeniom. Pomoże to uniknąć konieczności używania jawnej konwersji daty.
Możesz uwzględnić czas letni w SQL Server za pomocą funkcji AT TIME ZONE, zaczynając od SQL