GETDATE 関数と SYSDATETIME 関数の違い:T-SQL で現在日時を取得する方法
GETDATE 関数と SYSDATETIME 関数の違いについて
SQL Server を使って開発をしていると、「現在の日時」を取得する機会がたくさんあります。
T-SQL で現在の日時を取得したい時、GETDATE 関数やSYSDATETIME 関数がよく使われます。
この記事では、GETDATE 関数と SYSDATETIME 関数の基本的な使い方と、この二つの関数の違い、使い分けのポイントなどをご説明します。
GETDATE 関数の使い方と特徴
T-SQL で現在の日時を取得したい時に一番よく使われるのが GETDATE 関数だと思います。
GETDATE 関数は、タイムゾーンオフセットなしの、データベースシステムのタイムスタンプを返します。
通常 SQL Server のインスタンスが実行されている、OS の現在時刻と同じになります。
使い方はシンプルで、引数なしで次のようにして現在日時を取得できます。
SELECT GETDATE();
[実行結果]
GETDATE 関数の戻り値のデータ型は DATETIME になります。
以下のように複数行を返す SELECT 文の SELECT 句で GETDATE 関数
を使うと、一度だけしか評価されないので、戻り値は全部同じになります。SELECT GETDATE() FROM sys.objects;
[実行結果]
SYSDATETIME 関数の使い方と特徴
T-SQL で現在の日時を取得したい時に候補に上がるのが SYSDATETIME 関数かと思います。
SYSDATETIME 関数も、タイムゾーンオフセットなしの、データベースシステムのタイムスタンプを返します。
通常 SQL Server のインスタンスが実行されている、OS の現在時刻と同じになります。
使い方もGETDATE 関数と同様で、引数なしで次のようにして現在日時を取得できます。
SELECT SYSDATETIME();
[実行結果]
SYSDATETIME 関数の戻り値のデータ型は datetime2(7) になります。
先ほどのように、複数行を返す SELECT 文の SELECT 句で SYSDATETIME 関数
を使うと、こちらも全行同じ日時が返ってきます。SELECT SYSDATETIME() FROM sys.objects;
[実行結果]
GETDATE 関数 と SYSDATETIME 関数の違い
GETDATE 関数と SYSDATETIME 関数の大きな違いは、戻り値の精度です。
GETDATE 関数は DATETIME 型の値を返し、 SYSDATETIME 関数は、DATETIME2(7) 型の値を返します。
DATETIME2 の後の (7) は秒の小数点以下に何桁まで保持するかを示していて、ここでは 7 桁となっています。
DATETIME 型と DATETIME2 型のデータ型は次のように違います。
DATETIME 型
フォーマット: yyyy-MM-dd HH:mm:ss.nnn
範囲: 1753-01-01 から 9999-12-31
精度: 0.00333 秒
例: 2025-07-23 23:55:12.837
DATETIME2 型
フォーマット: yyyy-MM-dd HH:mm:ss.nnnnnnn
範囲: 0001-01-01 00:00:00.0000000 から 9999-12-31 23:59:59.9999999
精度: 100 ナノ秒
例: 2025-07-23 23:55:12.8382443
日付の範囲に関しては、現在の日付をとるので、DATETIME 型で 1753 年よりも前の年に対応していなくても、今回のケースでは問題がないと思います。
気にしないとけいないのは精度が違うところです。
DATETIME 型の精度は 0.00333 秒なので、現在の時間は 1 / 300 秒ごとの刻み(0.00333秒)で丸められます。
次のような日時を表す文字列を DATETIME 型にキャストすると、戻り値は以下のようになります。
SELECT CAST('2025-07-23 19:34:56.000' AS DATETIME) AS D0, --> 2025-07-23 19:34:56.000 CAST('2025-07-23 19:34:56.001' AS DATETIME) AS D1, --> 2025-07-23 19:34:56.000 CAST('2025-07-23 19:34:56.002' AS DATETIME) AS D2, --> 2025-07-23 19:34:56.003 CAST('2025-07-23 19:34:56.003' AS DATETIME) AS D3, --> 2025-07-23 19:34:56.003 CAST('2025-07-23 19:34:56.004' AS DATETIME) AS D4, --> 2025-07-23 19:34:56.003 CAST('2025-07-23 19:34:56.005' AS DATETIME) AS D5, --> 2025-07-23 19:34:56.007 CAST('2025-07-23 19:34:56.006' AS DATETIME) AS D6, --> 2025-07-23 19:34:56.007 CAST('2025-07-23 19:34:56.007' AS DATETIME) AS D7, --> 2025-07-23 19:34:56.007 CAST('2025-07-23 19:34:56.008' AS DATETIME) AS D8, --> 2025-07-23 19:34:56.007 CAST('2025-07-23 19:34:56.009' AS DATETIME) AS D9; --> 2025-07-23 19:34:56.010
[実行結果]
同じ日時を表す文字列を DATETIME2 型にキャストすると、戻り値は以下のようになります。
SELECT CAST('2025-07-23 19:34:56.000' AS DATETIME2) AS D0, --> 2025-07-23 19:34:56.0000000 CAST('2025-07-23 19:34:56.001' AS DATETIME2) AS D1, --> 2025-07-23 19:34:56.0010000 CAST('2025-07-23 19:34:56.002' AS DATETIME2) AS D2, --> 2025-07-23 19:34:56.0020000 CAST('2025-07-23 19:34:56.003' AS DATETIME2) AS D3, --> 2025-07-23 19:34:56.0030000 CAST('2025-07-23 19:34:56.004' AS DATETIME2) AS D4, --> 2025-07-23 19:34:56.0040000 CAST('2025-07-23 19:34:56.005' AS DATETIME2) AS D5, --> 2025-07-23 19:34:56.0050000 CAST('2025-07-23 19:34:56.006' AS DATETIME2) AS D6, --> 2025-07-23 19:34:56.0060000 CAST('2025-07-23 19:34:56.007' AS DATETIME2) AS D7, --> 2025-07-23 19:34:56.0070000 CAST('2025-07-23 19:34:56.008' AS DATETIME2) AS D8, --> 2025-07-23 19:34:56.0080000 CAST('2025-07-23 19:34:56.009' AS DATETIME2) AS D9; --> 2025-07-23 19:34:56.0090000
[実行結果]
DATETIME 型にキャストしたほうは、1 / 300 秒ごとの刻みに丸められていて、DATETIME2 型にキャストしたほうは、日時を表す文字列がそのまま情報を失わず変換されていることがわかります。
ですので、欲しい現在日時が、秒単位までで良いのような時は GETDATE 関数で十分だと思います。
現在日時を取得する際に、精度が重要な用途の時には SYSDATETIME 関数を使うとよいと思います。
以上、GETDATE 関数と SYSDATETIME 関数の基本的な使い方と、この二つの関数の違い、使い分けのポイントなどをご説明しました。