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 関数と SYSDATETIME 関数の違い 1

GETDATE 関数の戻り値のデータ型は DATETIME になります。


以下のように複数行を返す SELECT 文の SELECT 句で GETDATE 関数

を使うと、一度だけしか評価されないので、戻り値は全部同じになります。

SELECT GETDATE()
FROM   sys.objects;

[実行結果]
GETDATE 関数と SYSDATETIME 関数の違い 2


SYSDATETIME 関数の使い方と特徴

T-SQL で現在の日時を取得したい時に候補に上がるのが SYSDATETIME 関数かと思います。

SYSDATETIME 関数も、タイムゾーンオフセットなしの、データベースシステムのタイムスタンプを返します。

通常 SQL Server のインスタンスが実行されている、OS の現在時刻と同じになります。

使い方もGETDATE 関数と同様で、引数なしで次のようにして現在日時を取得できます。

SELECT SYSDATETIME();

[実行結果]
GETDATE 関数と SYSDATETIME 関数の違い 3

SYSDATETIME 関数の戻り値のデータ型は datetime2(7) になります。


先ほどのように、複数行を返す SELECT 文の SELECT 句で SYSDATETIME 関数

を使うと、こちらも全行同じ日時が返ってきます。

SELECT SYSDATETIME()
FROM   sys.objects;

[実行結果]
GETDATE 関数と SYSDATETIME 関数の違い 4


GETDATE 関数 と SYSDATETIME 関数の違い

GETDATE 関数と SYSDATETIME 関数の違い 0

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

[実行結果]
GETDATE 関数と SYSDATETIME 関数の違い 5


同じ日時を表す文字列を 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

[実行結果]
GETDATE 関数と SYSDATETIME 関数の違い 6

DATETIME 型にキャストしたほうは、1 / 300 秒ごとの刻みに丸められていて、DATETIME2 型にキャストしたほうは、日時を表す文字列がそのまま情報を失わず変換されていることがわかります。


ですので、欲しい現在日時が、秒単位までで良いのような時は GETDATE 関数で十分だと思います。

現在日時を取得する際に、精度が重要な用途の時には SYSDATETIME 関数を使うとよいと思います。


以上、GETDATE 関数と SYSDATETIME 関数の基本的な使い方と、この二つの関数の違い、使い分けのポイントなどをご説明しました。

© 2010-2025 SQL Server 入門