sql >> Database >  >> RDS >> Sqlserver

Verschillende manieren om de SQL CONVERT-datumfunctie te gebruiken

In dit artikel onderzoeken we het gebruik van de verschillende SQL CONVERT-datumnotaties binnen SQL Server.

Datuminterpretatie varieert tussen verschillende landen. Stel dat u een globale SQL Server-database hebt met een tabel die een specifieke datumnotatie bevat. Het heeft bijvoorbeeld een datumkolom met de waarde 01/05/2020.

Hoe interpreteer je het? Laten we eens kijken naar de volgende interpretaties in verschillende landen.

  • VS:5 januari 2020 (standaardformaat – mm/dd/jjjj)
  • Europa:1 mei 2020 (standaardformaat – dd/mm/jjjj)

Bovendien volgen andere landen verschillende datumformaten:

  • Turkije:dd.mm.jjjj
  • India:dd-mm-jjjj
  • Bulgarije:jjjj-m-d
  • Hongarije:jjjj.mm.dd.

U kunt Wikipedia raadplegen voor meer informatie over datumnotaties per land.

Afgezien hiervan willen we soms ook de tijdstempel samen met datums opnemen. Een paar voorbeelden hiervan zijn:

  • 05/01/2020 10:00 uur
  • 0/05/2020 14:00
  • 05-05-2020 14:00 uur
  • 05/01/2020 02:00:55 AM

Het is niet mogelijk om datums in een SQL Server-tabel in verschillende formaten op te slaan, dus we hebben een manier nodig om datumformaten te converteren. Laten we eens kijken naar de verschillende SQL CONVERT-methodes voor datumnotatie.

SQL CONVERT-datumfunctie

Doorgaans gebruiken databaseprofessionals de SQL CONVERT-datumfunctie om datums in een gespecificeerd en consistent formaat te krijgen. Dit past de stijlcodes toe voor specifieke uitvoerdatums.

Syntaxis van CONVERT()-functie:

CONVERTEREN(gegevenstype; datumtijd [,stijl])

In de onderstaande SQL-query converteren we de datetime naar twee formaten met behulp van de CONVERT()-functie.

  • mm/dd/jj formaat:stijlcode 1
  • mm/dd/jjjj formaat:stijlcode 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]

Op dezelfde manier kunnen we verschillende stijlcodes specificeren, zodat u datums kunt converteren naar het door u gewenste formaat.

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]

In de onderstaande schermafbeelding kunt u de stijlcode, hun standaarden, formaten en uitvoerdatums zien.

Datums converteren met de functie FORMAT()

In de bovenstaande CONVERT()-functie moeten we stijlcodes specificeren voor een specifieke formaatuitvoer. Meestal willen we deze codes niet onthouden; daarom heeft Microsoft de functie FORMAT() in SQL Server 2012 geïntroduceerd.

De syntaxis wordt hieronder weergegeven.

FORMAT (waarde, formaat [, cultuur])

Waarde :Het vereist een waarde in het ondersteunde formaat. U kunt de Microsoft-documentatie raadplegen voor een gedetailleerde lijst.

Formaat :In het formaat kunnen we de formaatcodes of het patroon specificeren om de invoerdatumgegevens te verbergen. Het onderstaande script toont de formaatcodes, het patroon en het uitvoerformaat.

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'

Cultuur :Het is een optioneel argument en definieert de cultuur. Als we geen cultuur specificeren, gebruikt SQL Server de taal van de huidige sessie.

In de onderstaande query zullen we een datumnotatie omzetten in een gespecificeerde cultuur. We moeten de cultuurcode specificeren. De cultuurcode voor de VS is bijvoorbeeld en-US en hi-IN is voor India.

De scripts gebruiken de d formaatcode voor korte datumpatronen.

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)';

U krijgt het datumformaat in een bepaalde cultuur, zoals hieronder weergegeven.

Als u de datum wilt weergeven in het volledige datum/tijd (lange tijd) patroon, specificeert u de formaatcode F, en het verandert snel uw datumformaat.

In de datumnotatie kunt u ook de aangepaste notaties specificeren en het converteert de invoerdatumstring volgens uw vereisten.

Om de aangepaste strings te specificeren, kunnen we de volgende afkortingen gebruiken.

  • dd:Dag van de maand (01 tot 31)
  • dddd:dag spelling
  • MM:maandnummer (01 tot 12)
  • MMMM:spelling van de maand
  • yy:jaar in twee cijfers
  • yyyy:jaartal van vier cijfers
  • hh:het is het uur 01 tot 12
  • HH:Het geeft 24 uur. formaat uur 00 tot 23
  • mm:minuut 00 tot 59
  • ss:seconde van 00 tot 59
  • tt:AM of PM

In het onderstaande script hebben we de invoerdatumformaten omgezet in meerdere formaten met behulp van de bovenstaande afkortingen of codes.

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]

AT TIME ZONE gebruiken in SQL Server 2016 of later

Verschillende landen volgen verschillende tijdzones. Gewoonlijk volgen deze tijdzones de afwijking van de Coordinated Universal Time (UTC)-tijd. Een paar voorbeelden van tijdzones zijn:

  • Australische centrale zomertijd:UTC +10:30
  • Indiase standaardtijd:UTC +5:30
  • Mountain Daylight Time:UTC-6
  • Singapore-tijd:UTC+8
  • Centrale zomertijd:UTC-5

U kunt dit artikel raadplegen voor een gedetailleerde lijst met tijdzones.

Veel landen volgen zomertijd en de klok wordt 1 uur (of 30-45 minuten) aangepast, afhankelijk van de tijdzones. Centrale zomertijd volgde bijvoorbeeld het onderstaande schema:

  • Standaardtijd begon:1 november 2020 02:00 uur lokale tijd. De klokken zijn een uur teruggedraaid.
  • Standaardtijd eindigt op 14 maart 2021 02:00 uur lokale tijd. Klokken gaan een uur vooruit.

SQL Server is niet op de hoogte van deze tijdzones en zomertijd. Gewoonlijk volgt een organisatie de UTC-zones omdat er geen wijzigingen nodig zijn.

Hoe kunnen we tijdzones converteren in SQL Server?

U kunt AT TIJDZONE gebruiken vanaf SQL Server 2016 en de tijdzones converteren. In de onderstaande zoekopdracht worden datums weergegeven voor de Central Standard Time, India Standard Time en Samoa Standard Time.

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'

Als u de ondersteunde tijdzones wilt weten, kunt u een query uitvoeren op sys.time_zone_info  en het geeft de tijdzone en de offset terug.

U kunt vervolgens de tijdzones filteren die momenteel gelden voor zomertijd.

Select * from sys.time_zone_info where is_currently_dst=1

Laten we nu eens kijken naar de zomertijd voor Eastern Time.

  • De zomertijd is ingegaan – zondag 8 maart 2020 om 02:00 uur.
  • Zomertijd eindigde op zondag 1 november 2020 om 02:00 uur.

Zet uw UTC-zone om in de Eastern Standard Time en u kunt de impact van zomertijd opmerken.

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];

Nuttige punten voor het gebruik van SQL CONVERT-datumnotaties

Evalueer uw toepassingsvereisten en kies het juiste gegevenstype datum, SmallDateTime, DateTime, DateTime2 en DateTimeOffset.

U kunt het datumformaat converteren met de SQL CONVERT-datum- en FORMAT-functies; het is echter raadzaam om het formaat te gebruiken dat het beste aansluit bij uw werklast. Zo voorkom je dat je de expliciete datumconversie moet gebruiken.

U kunt rekening houden met zomertijd in SQL Server met behulp van de AT TIME ZONE-functie vanaf SQL


  1. Geparametriseerde queries met psycopg2 / Python DB-API en PostgreSQL

  2. Hoe een binaire afbeelding uit de database op te halen met C# in ASP.NET

  3. 5 belangrijke voordelen voor Microsoft Access

  4. Is er een MySQL-optie/-functie om de geschiedenis van wijzigingen in records bij te houden?