サーバーで日付を取得するということは日常茶飯事ですが、その方法にも様々なものがあります。
そこで今回はこの日付について解説してみたいと思います。
SQL学習中の方は、これらの方法をいくつ知っているかチェックの意味も込めて最後まで読んでみてください。
日付取得の種類
まず最初にどのようなものがあるかを列挙してみます。
既に知っているものであれば飛ばして読んでいただいて結構ですので、以下の一覧に目を通してみてください。
- SYSDATETIME()
- SYSDATETIMEOFFSET()
- SYSUTCDATETIME()
- CURRENT_TIMESTAMP
- GETDATE()
- GETUTCDATE()
これらの中には似たような性質を持つものも含まれていますが、基本的には全部覚えておいても損はないでしょう。
次からは一つずつの特性を交えながら実際に使って解説していきます。
SYSDATETIME()
インスタンスを実行しているコンピューターの日付(時刻を含む)をdatetime(7)の形で返します。
記述は次の通りです。
// 基本記述 SELECT SYSDATETIME() // 表示確認 SELECT SYSDATETIME() AS SELECT_SYSDATETIME_Result; GO SELECT_SYSDATETIME_Result -------------------------------------- 2020-10-30 12:11:54.4852099 (1 行処理されました)
SYSDATETIMEOFFSET()
こちらは先ほどのSYSDATETIME()にタイムゾーンオフセットを含んだ値が返されます。
返す値の形はdatetimeoffset(7)となります。
// 基本記述 SELECT SYSDATETIMEOFFSET() // 表示確認 SELECT SYSDATETIMEOFFSET() AS SELECT_SYSDATETIMEOFFSET_Result; GO SELECT_SYSDATETIMEOFFSET_Result --------------------------------------------- 2020-10-30 12:15:54.6607550 +09:00 (1 行処理されました)
SYSUTCDATETIME()
こちらはSYSDATETIME()とよく似ていますが、インスタンスを実行しているコンピューターの日付(時刻を含む)をdatetime2の形で返します。
datetime2とはdatetimeの拡張版のようなもので、日付範囲と規定の有効桁数を増やし、ユーザーが必要に応じて有効桁数を指定できるようにしたものになっています。
SYSUTCDATETIME()で返される日付(時刻を含む)はUTC(協定世界時)となります。
またSYSUTCDATETIME()はSYSDATETIME()に比べ、秒の小数部分の精度が高くなっています。
// 基本記述 SELECT SYSUTCDATETIME() // 表示確認 SELECT SYSUTCDATETIME() AS SELECT_SYSUTCDATETIME_Result; GO SELECT_SYSUTCDATETIME_Result -------------------------------------- 2020-10-30 03:25:59.0861248 (1 行処理されました)
CURRENT_TIMESTAMP
データベースシステムにおける現在のタイムスタンプをdatetimeで返します。
値を返す際にCURRENT_TIMESTAMPはタイムゾーンオフセットを持ちませんので注意して下さい。
// 基本記述 SELECT CURRENT_TIMESTAMP // 表示確認 SELECT CURRENT_TIMESTAMP AS SELECT_CURRENT_TIMESTAMP_Result; GO SELECT_CURRENT_TIMESTAMP_Result ------------------------------- 2020-10-30 21:43:50.490 (1 行処理されました)
GETDATE()
基本的な挙動や仕様はCURRENT_TIMESTAMPと同じです。
ですからこちらも現在のタイムスタンプをdatetimeで返します。
当然CURRENT_TIMESTAMPと同じようにタイムゾーンオフセットを持ちません。
唯一の違いはCURRENT_TIMESTAMPはGETDATE()がないANSI準拠のデータベースに移植可能なため、CURRENT_TIMESTAMPの方が推奨される点でしょう。
// 基本記述 SELECT GETDATE() // 表示確認 SELECT GETDATE() AS SELECT_GETDATE_Result; GO SELECT_GETDATE_Result ----------------------- 2020-10-30 21:43:27.197 (1 行処理されました)
GETUTCDATE()
データベースシステムにおける現在のタイムスタンプをdatetimeで返します。
GETDATE()との違いは、UTC(協定世界時)で表示される点です。
// 基本記述 SELECT GETUTCDATE() // 表示確認 SELECT GETUTCDATE() AS SELECT_GETUTCDATE_Result; GO SELECT_GETUTCDATE_Result ------------------------ 2020-10-30 12:48:04.030 (1 行処理されました)
全て列挙してみましたが、こうしてみると同じ挙動のものがいくつかあり、学習中の方にとっては混乱の材料となってしまうこともあるでしょう。
これらのクエリはフォーマットして使いやすい形に整形し使う場合がほとんどです。
どれを使えば良いかで悩んだ場合には、情報量の多いもの(例えばUTC(協定世界時)があるものなど)を優先して使っておけば間違いないと思います。
日付だけを取得する
今紹介したクエリを整形する際に、「必要なのは日付だけなんだけど…」という場合も当然想定されます。
こういった場合には「CONVERT」を使って整形をかけるだけで日付を簡単に取り出すことが出来ます。
CONVERTの使い方は非常に簡単なので、セットで覚えておきましょう。
基本記述は以下の通りです。
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
[ date_type ] には整形したい型を指定します。
[ experssion ] は、整形したい対象をそのまま指定します。
先ほど列挙したもの全ての日付だけを抜き出そうと思えば、次のようにすれば可能です。
SELECT CONVERT (date, SYSDATETIME()) ,CONVERT (date, SYSDATETIMEOFFSET()) ,CONVERT (date, SYSUTCDATETIME()) ,CONVERT (date, CURRENT_TIMESTAMP) ,CONVERT (date, GETDATE()) ,CONVERT (date, GETUTCDATE());
まとめ
いかがでしたか?
今回は日付に関する基本的な操作について解説してみました。
日付は扱う機会は非常に多いですが、決して難しいものではありませんし記述も非常に少ないため、初期学習といえます。
この記事で日付を完全に理解できるように頑張りましょう。