Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Różne sposoby wykorzystania funkcji daty SQL CONVERT

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolejność wykonania zapytania SQL

  2. Wzorzec projektowy dla pól niestandardowych w relacyjnej bazie danych

  3. SQL Server int vs nvarchar porównanie wydajności?

  4. Co to jest typ danych SYSNAME w SQL Server?

  5. Procedura składowana lub funkcja oczekuje parametru, który nie jest dostarczany