この記事では、SQLServer内でさまざまなSQLCONVERT日付形式を使用する方法について説明します。
日付の解釈は国によって異なります。特定の日付形式を保持するテーブルを持つグローバルSQLServerデータベースがあるとします。たとえば、値が2020年1月5日の日付列があります。
どのように解釈しますか?さまざまな国での次の解釈を見てみましょう。
- 米国:2020年1月5日(標準形式– mm / dd / yyyy)
- ヨーロッパ:2020年5月1日(標準形式– dd / mm / yyyy)
さらに、他の国では異なる日付形式に従います:
- トルコ:dd.mm.yyyy
- インド:dd-mm-yyyy
- ブルガリア:yyyy-m-d
- ハンガリー:yyyy.mm.dd。
国別の日付形式の詳細については、ウィキペディアを参照してください。
これとは別に、日付とともにタイムスタンプを含めたい場合もあります。このいくつかの例は次のとおりです。
- 2020年1月5日午前10時
- 2020年0月5日14:00
- 0/05/2020 02:00 PM
- 2020年1月5日02:00:55AM
SQL Serverテーブルにさまざまな形式で日付を格納することはできないため、日付形式を変換する方法が必要です。さまざまなSQLCONVERT日付形式の方法を調べてみましょう。
SQLCONVERT日付関数
通常、データベースの専門家はSQL CONVERT日付関数を使用して、指定された一貫性のある形式で日付を取得します。これにより、特定の出力日にスタイルコードが適用されます。
CONVERT()関数の構文:
CONVERT(datatype、datetime [、style])
以下のSQLクエリでは、CONVERT()関数を使用して日時を2つの形式に変換します。
- mm / dd / yy形式:スタイルコード1
- mm / dd / yyyy形式:スタイルコード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]
同様に、さまざまなスタイルコードを指定できるため、日付を必要な形式に変換できます。
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]
以下のスクリーンショットでは、スタイルコード、それらの標準、形式、および出力日を確認できます。
FORMAT()関数を使用した日付の変換
上記のCONVERT()関数では、特定のフォーマット出力のスタイルコードを指定する必要があります。通常、これらのコードを覚えておく必要はありません。そのため、MicrosoftはSQL Server 2012にFORMAT()関数を導入しました。
構文を以下に示します。
FORMAT(value、format [、culture])
価値 :サポートされている形式の値が必要です。詳細なリストについては、Microsoftのドキュメントを参照してください。
フォーマット :フォーマットでは、入力された日付データを隠すためのフォーマットコードまたはパターンを指定できます。以下のスクリプトは、フォーマットコード、パターン、および出力フォーマットを示しています。
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'
文化 :これはオプションの引数であり、カルチャを定義します。カルチャを指定しない場合、SQLServerは現在のセッションの言語を使用します。
以下のクエリでは、日付形式を指定されたカルチャに変換します。カルチャコードを指定する必要があります。たとえば、米国のカルチャコードはen-USで、hi-INはインドです。
スクリプトはdを使用します 短い日付パターンのフォーマットコード。
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)';
以下に示すように、指定されたカルチャで日付形式を取得します。
完全な日付/時刻(長時間)パターンで日付を出力する場合は、形式コードFを指定すると、日付形式がすばやく変更されます。
日付形式では、カスタム形式を指定することもでき、要件に応じて入力された日付文字列を変換します。
カスタム文字列を指定するには、次の略語を使用できます。
- dd:月の日(01から31)
- dddd:日のつづり
- MM:月番号(01から12)
- MMMM:月のスペル
- yy:2桁の年
- yyyy:4桁の年
- hh:01から12の時間です
- HH:24時間かかります。時間00から23をフォーマットします
- mm:00〜59分
- ss:00から59までの2番目
- tt:午前または午後
以下のスクリプトでは、上記の略語またはコードを使用して、入力された日付形式を複数の形式に変換しました。
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]
SQLServer2016以降でATTIMEZONEを使用する
国が異なれば、タイムゾーンも異なります。通常、これらのタイムゾーンは、協定世界時(UTC)時間からのオフセットに従います。タイムゾーンの例は次のとおりです。
- オーストラリア中央日照時間:UTC +10:30
- インド標準時:UTC +5:30
- 山岳部夏時間:UTC-6
- シンガポール時間:UTC + 8
- 中部夏時間:UTC-5
タイムゾーンの詳細なリストについては、この記事を参照してください。
多くの国では夏時間が採用されており、タイムゾーンに応じて時計が1時間(または30〜45分)調整されます。たとえば、中部夏時間は次のスケジュールに従いました。
- 標準時の開始:2020年11月1日02:00現地時間。時計は1時間戻されました。
- 標準時は2021年3月14日02:00現地時間で終了します。時計は1時間進みます。
SQL Serverは、これらのタイムゾーンと夏時間を認識していません。通常、組織は変更を必要としないため、UTCゾーンに従います。
SQL Serverでタイムゾーンを変換するにはどうすればよいですか?
SQLServer2016以降でATTIMEZONEを使用して、タイムゾーンを変換できます。以下のクエリでは、中部標準時、インド標準時、サモア標準時の日付が表示されます。
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'
サポートされているタイムゾーンを知るには、 sys.time_zone_infoに問い合わせます。 タイムゾーンとオフセットを返します。
次に、現在夏時間に準拠しているタイムゾーンをフィルタリングできます。
Select * from sys.time_zone_info where is_currently_dst=1
それでは、東部標準時の夏時間について考えてみましょう。
- 夏時間が始まりました–2020年3月8日日曜日の午前2時。
- 夏時間の終了-2020年11月1日日曜日の午前2:00。
UTCゾーンを東部標準時に変換すると、夏時間の影響に注意できます。
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];
SQLCONVERT日付形式を使用するための便利なポイント
アプリケーション要件を評価し、適切なデータ型date、SmallDateTime、DateTime、DateTime2、およびDateTimeOffsetを選択します。
SQL CONVERT日付およびFORMAT関数を使用して、日付形式を変換できます。ただし、ワークロードを最も厳密に満たす形式を使用することをお勧めします。これにより、明示的な日付変換を使用する必要がなくなります。
SQLから始まるATTIMEZONE関数を使用して、SQLServerの夏時間を考慮することができます