sql >> データベース >  >> RDS >> Sqlserver

SQLCONVERT日付関数を使用するさまざまな方法

    この記事では、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の夏時間を考慮することができます


    1. PostgresでのLIKEと〜の違い

    2. 大したこと:SQL Server 2016 Service Pack 1

    3. SQLIN句でのタプルの使用

    4. MySQLでSELECTINTOOUTFILEを使用する