よく使われる日付と時刻の関数 2 - DATEADD, DATEDIFF, ISDATE

よく使われる日付と時刻の関数 2 - DATEADD, DATEDIFF, ISDATE

前回は 「 よく使われる日付と時刻の関数 1 - GETDATE, YEAR, MONTH, DAY, DATEPART 」 で、 よく使われる日付と時刻の組み込み文字列関数のうち、GETDATE, YEAR, MONTH, DAY, DATEPART を使ってみました。

今回は、日付と時刻の関数の DATEADD, DATEDIFF, ISDATE を使ってみましょう。


DATEADD ファンクション

DATEADD ファンクションは、日時の指定した部分に、指定した数を足した日時を返す関数です。 構文は次の通りです。

DATEADD ([追加する部分], [追加する数], [日時] )

[追加する部分] には、次のような指定が可能です。 カッコの中のように省略して指定することも可能です。

年 - year (yy, yyyy)
月 - month (mm, m)
日 - day (dd, d)
時 - hour (hh)
分 - minute (mi, n)
秒 - second (ss, s)

※ よく使うものだけをピックアップしています。

[追加する数] は整数で指定し、マイナスの値でも大丈夫です。


例えば、2017-07-31 22:12:33.530 に、DATEADD で それぞれの日時の 「 部分 」 に 「 1 」 を追加すると次のようになります。

DECLARE @Input DATETIME = '2017-07-31 22:12:33.530';

SELECT  DATEADD(yy, 1, @Input) AS yy_Input,
        DATEADD(mm, 1, @Input) AS mm_Input,
        DATEADD(dd, 1, @Input) AS dd_Input;

SELECT  DATEADD(hh, 1, @Input) AS hh_Input,
        DATEADD(mi, 1, @Input) AS mi_Input,
        DATEADD(ss, 1, @Input) AS ss_Input;

[ 実行結果 ]
DATEADD ファンクション

それぞれ指定した部分に 1 が追加された日付が返ってきていますね。

DATEDIFF ファンクション

DATEDIFF ファンクションは、[日時 1] と [日時 2] の日時の差分を、[戻り値の単位] で指定した単位の整数で返します。 構文は次の通りです。

DATEDIFF ([戻り値の単位], [日時 1], [日時 2])

[戻り値の単位] には、次のような指定が可能です。 カッコの中のように省略して指定することも可能です。

年 - year (yy, yyyy)
月 - month (mm, m)
日 - day (dd, d)
時 - hour (hh)
分 - minute (mi, n)
秒 - second (ss, s)

※ よく使うものだけをピックアップしています。


例えば、 2017-07-31 22:12:33.530 と 2017-08-10 02:10:55.320 の差分を、それぞれの [戻り値の単位] を取得すると、次のようになります。

DECLARE @Input1 DATETIME = '2017-07-31 22:12:33.530',
        @Input2 DATETIME = '2017-08-10 02:10:55.320';

SELECT  DATEDIFF(yy, @Input1, @Input2) AS yy_Input,
        DATEDIFF(mm, @Input1, @Input2) AS mm_Input,
        DATEDIFF(dd, @Input1, @Input2) AS dd_Input,
        DATEDIFF(hh, @Input1, @Input2) AS hh_Input,
        DATEDIFF(mi, @Input1, @Input2) AS mi_Input,
        DATEDIFF(ss, @Input1, @Input2) AS ss_Input;

[ 実行結果 ]
DATEDIFF ファンクション

ISDATE ファンクション

ISDATE ファンクションは、指定した文字列が、有効な DATE 型、TIME 型、もしくは DATETIME 型であった時に 1 を返す関数です。 構文は次の通りです。

ISDATE ( [文字列] )

DATETIME2 型の時は 0 を返します。 1753-01-01 から 9999-12-31 の日付でないと 0 が返ります。


例えば、次のような 5 つの Input に対し、ISDATE のチェックすると、次のようになります。

DECLARE @Input1 VARCHAR(30) = '0001-01-01',
        @Input2 VARCHAR(30) = '1/13/2018 20:00',
        @Input3 VARCHAR(30) = '13/1/2018 20:00',
        @Input4 VARCHAR(30) = '21:40',
        @Input5 VARCHAR(30) = 'ABC';

SELECT  ISDATE(@Input1),
        ISDATE(@Input2),
        ISDATE(@Input3),
        ISDATE(@Input4),
        ISDATE(@Input5);

[ 実行結果 ]
ISDATE ファンクション

@Input1 の '0001-01-01' は 1753-01-01 から 9999-12-31 の範囲外なので 0、 @Input5 の 'ABC' も、もちろん 0 が返ってきています。

注目していただきたいのは、@Input3 の '13/1/2018 20:00' に 0 が返っている点です。 dd/MM/yyyy のように、day から日付を始める国もあると思いますが、Invalid と判断されています。

ISDATE の戻り値は DATEFORMAT や LANGUAGE の設定に依存します。

私の環境では、次のように LANGUAGE が us_english、DATEFORMAT が mdy になっているため、dd/MM/yyyy のフォーマットの日付には 0 が返ってきました。

ISDATE ファンクション


SET LANGUAGE British; で言語を英語 (U.K.)に変更して、先ほどを同じインプットで ISDATE を試してみると、@Input2 と @Input3 の戻り値が反対になっていることがわかります。

[ 実行結果 ]
ISDATE ファンクション
ISDATE ファンクション


次は、よく使われる順位付け関数の ROW_NUMBER ファンクションを使ってみましょう。

© 2010-2024 SQL Server 入門