日時データの使用

このトピックの以下のセクションでは、日付および時刻のデータ型と関数の使用方法と使用例を紹介します。Transact-SQL の日付と時刻のデータ型および関数の概要については、「日付と時刻のデータ型および関数 (Transact-SQL)」を参照してください。

  • 日付/時刻データ型での演算子の使用

  • 日付/時刻形式の使用

  • 文字列リテラルの日付/時刻形式

  • 区切りのない文字列形式

  • ISO 8601 形式

  • アルファベット日付形式

  • 数値日付形式

  • 時刻形式

  • ODBC 日付時刻形式

  • date、time、datetime2、および datetimeoffset の変換

  • 文字列リテラルと time(n)、date、datetime2(n)、および datetimeoffset(n) の間の変換

  • 日付/時刻データ型間の変換

  • time、date、datetime2、および datetimeoffset での CAST と CONVERT の使用

  • CONVERT 関数のスタイル引数

  • SQL Server の日付/時刻の制限

  • 下位クライアントの下位互換性

日付/時刻データ型での演算子の使用

すべての日付/時刻データ型で、関係演算子 (<、<=、>、>=、<>)、比較演算子 (=、<、<=、>、>=、<>、!<、!>)、および論理演算子とブール述語 (IS NULL、IS NOT NULL、IN、BETWEEN、EXISTS、NOT EXISTS、LIKE) がサポートされています。

日付/時刻の算術演算子

すべての日付/時刻データ型の加算および減算には、DATEADDDATEDIFF を使用します。

日付/時刻形式の使用

文字列リテラル形式は、アプリケーションでユーザーに表示されるデータに影響しますが、SQL Server の基になる整数のストレージ形式には影響しません。ただし、アプリケーションやユーザーによって格納のために入力されたり、日付関数への入力として入力されたりした文字列リテラル形式の日付値が、SQL Server で別の日付として解釈される場合もあります。この解釈は、文字列リテラル形式、データ型、および実行時の SET DATEFORMATSET LANGUAGE、および default language オプションの設定の組み合わせによって決まります。

これらの設定の影響を受けない文字列リテラル形式もあります。使用する形式に対して正しい設定になっていることがわかっている場合以外は、これらの設定に依存しない形式を使用することを検討してください。ISO 8601 形式は、これらの設定に依存しない国際標準の形式です。システム設定に依存する文字列リテラル形式を使用している Transact-SQL は、移植性が低くなります。

下位クライアントの既定の文字列リテラル形式を確認するには、各日付/時刻データ型のトピックを参照してください。Transact-SQL の日付と時刻のデータ型および関数の概要については、「日付と時刻のデータ型および関数 (Transact-SQL)」を参照してください。

ydm の日付形式は、date 型、datetime2 型、および datetimeoffset 型ではサポートされていません。ランタイム エラーが発生します。

文字列リテラルの日付/時刻形式

次の表は、さまざまな日付/時刻文字列形式の一覧です。DATEFORMAT に依存しない多言語対応の日付/時刻形式を使用することをお勧めします。ISO 8601 形式 ('1998-02-23T14:23:05' および '1998-02-23T14:23:05-08:00') は唯一の国際標準形式で、DATEFORMAT や既定のログイン言語に依存せず、多言語にも対応しています。

日付/時刻部分

形式の種類

形式の例

その他の形式との組み合わせ

DATEFORMAT への依存

多言語対応

日付

区切りなし

ISO 8601

'19980223'

非依存

日付

数値

'02/23/1998'

依存

不可

(DATEFORMAT)

日付

ISO 8601 数値

'1998-02-23'

非依存

不可

日付

アルファベット

'23 February 1998'

非依存

不可

(月の名前または短縮名)

日付

ODBC 日付

{d '1998-02-23'}

不可

非依存

時刻

ISO 8601 時刻

'14:23:05'

'10:00:00.123456'

非依存

時刻

ODBC 時刻

{t '14:23:05'}

不可

非依存

日付/時刻

ODBC 日付時刻

{ts '1998-02-23 14:23:05'}

不可

非依存

日付/時刻

ISO 8601

'1998-02-23T14:23:05'

'1998-02-23T14:23:05 -08:00'

不可

非依存

可 (date、datetime2、datetimeoffset)

日付/時刻

ANSI SQL 標準

'1998-02-23 14:23:05'

'1998-02-23 14:23:05 -08:00'

不可

非依存 (datetime2、datetimeoffset)

依存 (datetime)

可 (date、datetime2、datetimeoffset)

日付/時刻

日付と時刻の組み合わせ

'19980223 14:23:05'

'02/23/1998 2:23:05 PM'

'1998-02-23 10:00:00.123'

'23 Feb 1998 14:23:05'

不可

依存

(日付部分)

不可

タイム ゾーン

タイム ゾーン形式

'+12:00'

'01:00'

'-08:00'

'Z'

非依存

次のステートメントは、SET LANGUAGE 設定と SET DATEFORMAT 設定の影響を示しています。

DECLARE @Today date = '12/1/2003';
DECLARE @MyTime time = '12:30:22';
DECLARE @MyDatetimeoffset datetimeoffset = '12/1/2003 12:30:22 -5:00';
SET LANGUAGE Italian
    -- Returns: Changed language setting to Italiano.
SELECT DATENAME(month, @Today) AS 'Month Name';
    -- Returns: dicembre
SELECT CONVERT(VARCHAR(30), @MyDatetimeoffset) AS 'DATETIMEOFFSET';
    -- Returns: dic  1 2003 12:30PM -05:00
SELECT DATENAME(hour, @MyTime) As 'Hour Name';
    -- Returns: 12

SET LANGUAGE us_english;
    -- Returns: Changed language setting to us_english.
SELECT DATENAME(month, @Today) AS 'Month Name';
    -- Returns: December
SELECT CONVERT(VARCHAR(30), @MyDatetimeoffset) AS 'DATETIMEOFFSET';
    -- Returns: Dec  1 2003 12:30PM -05:00
SELECT DATENAME(hour, @MyTime) As 'Hour Name';
    -- Returns: 12
GO
-- Set date format to month, day, year.
SET DATEFORMAT mdy;
GO
DECLARE @datevar date = '12/31/1998';
SELECT @datevar AS DateVar;
    -- Returns: 1998-12-31
GO
-- Set date format to year, day, month. 
SET DATEFORMAT ydm;
GO
DECLARE @datevar datetimeoffset = '1998/31/12 12:30:22 -05:00';
SELECT @datevar AS DateVar;
    -- Returns: Msg 241, Conversion failed when converting 
    -- date and/or time from character string.
GO
-- Set date format to year, month, day.
SET DATEFORMAT ymd;
GO
DECLARE @datevar date = '12/31/1998';
SELECT @datevar AS DateVar;
    -- Returns: 1998-12-31
GO

区切りのない文字列形式

日付データを区切りのない文字列として指定できます。日付データは、4 桁、6 桁、8 桁の数字、空文字列、または日付値のない時刻値で指定できます。

SET DATEFORMAT のセッション設定は、区切り文字のない数値エントリなど、すべて数字から成る日付エントリには適用されません。6 桁または 8 桁の文字列は、常に ymd と解釈されます。月と日は常に 2 桁です。

次に、有効な区切りのない文字列形式を示します。[19]960415

4 桁の文字列は、年と解釈されます。この場合、月と日は 1 月 1 日に設定されます。したがって、4 桁しか指定しない場合は世紀を含める必要があります。

ISO 8601 形式

ISO 8601 の日付/時刻形式を以下に示します。

  • YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm]

  • YYYY-MM-DDThh:mm:ss[.nnnnnnn]Z (UTC、協定世界時)

T は、日付/時刻値の時刻の部分の先頭を示します。

ISO 8601 形式を使用するには、その形式で各要素を指定する必要があります。これには、T、コロン (:)、+ または -、およびピリオド (.) も含まれます。角かっこは、秒の小数部やタイム ゾーン オフセットの構成要素が省略可能であることを示しています。

時の構成要素は 24 時間形式で指定します。

ISO 8601 形式を使用する利点は、これが国際標準であるという点です。この形式を使用して指定された日付/時刻値は明確です。この形式は、SET DATEFORMAT、SET LANGUAGE、およびログインの default language の設定の影響を受けません。

次に、ISO 8601 形式で指定された日付/時刻値の 2 つの例を示します。

  • 2004-05-23T14:25:10

  • 2004-05-23T14:25:10.1234567+07:00

アルファベット日付形式

月を名前で指定できます (たとえば英語の場合、April または省略形の Apr として指定できます)。これらは、セッションの LANGUAGE 設定で指定されている必要があります (たとえばフランス語では、avril または avr になります)。コンマは省略可能であり、大文字と小文字は無視されます。

アルファベット日付形式の使用に関するガイドラインを次に示します。

  • 日時データを単一引用符 (') で囲みます。

  • 西暦の最後の 2 桁のみを指定した場合、その値が two digit year cutoff 構成オプションの上限値の最後の 2 桁より小さければ、指定した西暦は終了年と同じ世紀になります。この構成オプションより値が大きいか、または同じである場合、指定した西暦は終了年の世紀より前の世紀になります。たとえば、two digit year cutoff が 2050 (既定値) である場合、25 は 2025 年と解釈され、50 は 1950 年と解釈されます。こうしたあいまいさを排除するため、4 桁の西暦を使用してください。

  • 日を省略したときは、その月の 1 日が指定されます。

  • 月をアルファベット形式で指定したときは、SET DATEFORMAT のセッション設定は適用されません。

  • SQL Server の日付データの有効なアルファベット形式の例を以下に示します。角かっこで囲まれた文字は省略可能です。

  • Apr[il] [15][,] 1996

  • Apr[il] 15[,] [19]96

  • Apr[il] 1996 [15]

  • [15] Apr[il][,] 1996

  • 15 Apr[il][,][19]96

  • 15 [19]96 apr[il]

  • [15] 1996 apr[il]

  • 1996 APR[IL] [15]

  • 1996 [15] APR[IL]

数値日付形式

日付データを数値の月で指定できます。たとえば、5/20/97 は 1997 年 5 月 20 日を表します。数値日付形式を使用する場合、文字列の年、月、日は、スラッシュ (/)、ハイフン (-)、またはピリオド (.) で区切って指定します。この文字列は、次の形式に従う必要があります。

number separator number separator number [time] [time]

有効な数値形式を次に示します。

  • [0]4/15/[19]96 -- (mdy)

  • [0]4-15-[19]96 -- (mdy)

  • [0]4.15.[19]96 -- (mdy)

  • [0]4/[19]96/15 -- (myd)

  • 15/[0]4/[19]96 -- (dmy)

  • 15/[19]96/[0]4 -- (dym)

  • [19]96/15/[0]4 -- (ydm)

  • [19]96/[0]4/15 -- (ymd)

セッションの既定の言語の DATEFORMAT は、ログインの default language、SET LANGUAGE ステートメント、または SET DATEFORMAT ステートメントによって設定されます。既定のログインまたは SET LANGUAGE ステートメントによって言語が us_english に設定されている場合、既定の日付順序は mdy になります。

日付順序は、SET DATEFORMAT ステートメントを使用して変更できます。SET DATEFORMAT の設定は、日付の値がどのように解釈されるかを決定します。指定した順序が設定と一致しない場合、範囲外となって日付として解釈されないか、または間違って解釈されます。たとえば、12/10/08 は、DATEFORMAT の設定によっては、6 種類の日付形式のうちのいずれにも解釈できます。4 桁の数字は年として解釈されます。

時刻形式

SQL Server では、時刻データとして次の形式が認識されます。それぞれの形式は単一引用符 (') で囲みます。

  • 14:30

  • 14:30[:20:999]

  • 14:30[:20.9]

  • 4am

  • 4 PM

  • [0]4[:30:20:500]AM

以下のステートメントは、CAST 関数に対するさまざまな入力の戻り値を示しています。

SELECT CAST('01/01/2000 14:30' AS datetime2)
    --Returns: 2000-01-01 14:30:00.0000000
SELECT CAST('01/01/2000 14:30:20:999' AS datetime2)
    -- Returns: 2000-01-01 14:30:20.9990000
SELECT CAST('01/01/2000 14:30:20.9' AS datetime2)
    -- Returns: 2000-01-01 14:30:20.9000000
SELECT CAST('01/01/2000 4am' AS datetime2)
    -- Returns: 2000-01-01 04:00:00.0000000
SELECT CAST('01/01/2000 4 PM' AS datetime2)
    -- Returns: 2000-01-01 16:00:00.0000000
SELECT CAST('01/01/2000 04:30:20:500AM' AS datetime2)
    -- Returns: 2000-01-01 04:30:20.5000000
SELECT CAST('01/01/2000 04:30:20:500 AM' AS datetime2)
    -- Returns: 2000-01-01 04:30:20.5000000
GO

AM または PM のサフィックスを指定すると、時刻値が午前か午後かを指定できます。AM および PM の大文字と小文字は区別されません。

時刻の指定には、12 時間方式と 24 時間方式のどちらも使用できます。時刻値は次のように解釈されます。

  • AM を指定したかどうかに関係なく、時刻値 00 は午前 00 時を表します。時刻値が 00 のときに PM を指定することはできません。

  • AM と PM のどちらも指定していない場合、01 から 11 までの時刻値は午前の時刻を表します。また、AM を指定した場合も午前の時刻を表します。PM を指定すると、午後の時刻を表します。

  • AM と PM のどちらも指定していない場合、時刻値 12 は正午を表します。AM を指定すると、午前 0 時を表します。PM を指定すると、正午を表します。たとえば、12:01 という値は、12:01 PM では正午を 1 分過ぎた時刻、12:01 AM では午前 0 時を 1 分過ぎた時刻を表します。12:01 AM と指定しても、00:01 または 00:01 AM と指定した場合と同じ時刻を表します。

  • 13 から 23 までの時刻値は、AM または PM を指定していなくても、午後の時刻を表します。また、PM を指定した場合も午後の時刻を表します。時刻値が 13 から 23 までの場合、AM を指定することはできません。

  • 時刻値 24 は有効ではないため、午前 0 時を表すときは 12:00 AM または 00:00 を使用します。

ミリ秒の前には、コロン (:) またはピリオド (.) を付けます。コロンを付けると、後続の値は、1,000 分の 1 秒単位になります。ピリオドを付けると、数字が 1 桁なら 10 分の 1 秒単位に、2 桁なら 100 分の 1 秒単位に、3 桁なら 1,000 分の 1 秒単位になります。たとえば、"12:30:20:1" は 12 時 30 分 20 秒を 1,000 分の 1 秒過ぎた時刻を表し、"12:30:20.1" は 12 時 30 分 20 秒を 10 分の 1 秒過ぎた時刻を表します。

ODBC 日付時刻形式

ODBC API では、日付/時刻値を表すエスケープ シーケンスが定義されます。ODBC ではこれをタイムスタンプ データと呼びます。この ODBC タイムスタンプ形式は、OLE DB 言語定義 (DBGUID-SQL) および Microsoft OLE DB Provider for SQL Server でもサポートされます。ADO、OLE DB、および ODBC ベースの API を使用しているアプリケーションでは、この ODBC タイムスタンプ形式を使用して日付/時刻を表すことができます。

SQL Server では、ODBC データは常に datetime データ型として扱われます。

ODBC タイムスタンプ エスケープ シーケンスの形式を次に示します。

{ literal_type 'constant_value' }

  • literal_type
    エスケープ シーケンスの種類を指定します。literal_type の有効な引数は次のとおりです。

    d = 日付のみ

    t = 時刻のみ

    ts = タイムスタンプ (時刻と日付)

  • 'constant_value'
    エスケープ シーケンスの値です。constant_value は literal_type ごとに次の形式に従う必要があります。

    literal_type

    constant_value の形式

    d

    YYYY-MM-DD

    t

    hh:mm:ss[.fff]

    ts

    YYYY-MM-DDhh:mm:ss[.fff]

ODBC 時刻日付定数の例を次に示します。

  • { ts '1998-05-02 01:23:56.123' }

  • { d '1990-10-02' }

  • { t '13:33:41' }

ODBC と OLE DB のタイムスタンプ データ型名を Transact-SQL の timestamp データ型名と混同しないでください。ODBC と OLE DB のタイムスタンプ データ型は日付と時刻を記録します。Transact-SQL の timestamp データ型は時刻関連値を持たないバイナリ データ型です。

date、time、datetime2、および datetimeoffset の変換

異なる日付型間の変換には、明示的な変換と暗黙的な変換の 2 種類があります。暗黙的な変換は、CAST 関数や CONVERT 関数を使用せずに行われます。明示的な変換では、CAST 関数または CONVERT 関数が必要です。

文字列リテラルと time(n)、date、datetime2(n)、および datetimeoffset(n) の間の変換

文字列リテラルから日付/時刻データ型への変換は、文字列のすべての部分が有効な形式になっている場合に可能になります。それ以外の場合はランタイム エラーが発生します。

日付/時刻データ型から文字列リテラルへの暗黙的な変換や、スタイルを指定しない明示的な変換では、現在のセッションの既定の形式が使用されます。

date 型、time 型、datetime2 型、および datetimeoffset 型から文字列への暗黙的な変換では、SQL 標準の形式 YYY-MM-DD hh:mi:ss.[nnnnnnn] (CONVERT スタイル 121) が適用されます。datetime 型と smalldatetime 型に対しては、CONVERT スタイル 0 の形式 (mon dd yyyy hh:miAM (または PM)) が適用されます。

date 型、time 型、datetime2 型、および datetimeoffset 型と文字列リテラルの間の変換の規則を次の表に示します。

入力文字列リテラル

date

time(n)

datetime2(n)

datetimeoffset(n)

ODBC 日付

注 1 を参照

注 1 を参照

注 1 を参照

注 1 を参照

ODBC 時刻

注 1 を参照

注 1 を参照

注 1 を参照

注 1 を参照

ODBC 日付時刻

注 1 を参照

注 1 を参照

注 1 を参照

注 1 を参照

日付のみ

単純変換

既定値が設定される

時刻部分は既定値の 00:00:00 に設定される

時刻部分は既定値の 00:00:00 に設定される。タイム ゾーンは既定値の +00:00 に設定される

時刻のみ

既定値が設定される

単純変換

日付部分は既定値の 1900-1-1 に設定される

日付部分は既定値の 1900-1-1 に設定される。タイム ゾーンは既定値の +00:00 に設定される

タイム ゾーンのみ

既定値が設定される

既定値が設定される

既定値が設定される

既定値が設定される

日付 + 時刻

入力文字列の日付部分が使用される

入力文字列の時刻部分が使用される

単純変換

タイム ゾーンは既定値の +00:00 に設定される

日付 + タイム ゾーン

使用不可

使用不可

使用不可

使用不可

時刻 + タイム ゾーン

既定値が設定される

入力文字列の時刻部分が使用される

日付部分は既定値の 1900-1-1 に設定される。タイム ゾーンの入力は無視される。

日付部分は既定値の 1900-1-1 に設定される

日付 + 時刻 + タイム ゾーン

ローカル datetime の日付部分が使用される

ローカル datetime の時刻部分が使用される

ローカル datetime が使用される

単純変換

変換についての注

  1. ODBC 文字列リテラルは、datetime データ型にマップされます。ODBC 日付時刻リテラルから date 型、time 型、datetime2 型、または datetimeoffset 型への代入演算を行うと、datetime 型とこれらの型との間で、変換規則で定義されている暗黙的な変換が行われます。

  2. datetime の秒の小数部の精度は 1/300 秒 (3.33 ミリ秒 (0.00333 秒)) です。値は、.000、.003、または .007 秒単位に丸められます。'08/22/1995 10:15:19:999' は、'.999' がこの精度を超えているため、丸められます。

  3. time(3)、datetime2(3)、および datetimeoffset(3) の秒の小数部の精度は 1 ミリ秒です。したがって、'1995-8-22 10:15:19:999' は丸められません。

  4. 入力のタイム ゾーン オフセットの部分は、hh と mm の両方が常に 2 桁である必要があります。+ または – の符号も必須です。

日付/時刻データ型間の変換

このセクションの表では、次の各日付および時刻データ型を他の日付および時刻データ型に変換する方法について説明します。

  • date

  • time(n)

  • datetime

  • smalldatetime

  • datetimeoffset(n)

  • datetime2

date データ型

次の表では、date データ型が他の日付および時刻データ型に変換される場合の処理について説明します。

変換先のデータ型

変換の詳細

time(n)

変換が失敗し、"オペランド型の不整合: date は time と互換性がありません" というエラー メッセージ 206 が表示されます。

datetime

日付がコピーされます。次のコードは、date 値を datetime 値に変換した結果を示しています。

DECLARE @date date
DECLARE @datetime datetime
SELECT @date = '12-10-25'
SELECT @datetime = @date
SELECT @date AS '@date', @datetime AS '@datetime'
--Result
--@date      @datetime
------------ -----------------------
--2025-12-10 2025-12-10 00:00:00.000
--
--(1 row(s) affected)

smalldatetime

date 値が smalldatetime の範囲内にある場合は、日付部分がコピーされ、時刻部分が 00:00:00.000 に設定されます。date 値が smalldatetime 値の範囲外の場合は、"date データ型から smalldatetime データ型への変換の結果、範囲外の値になりました。" というエラー メッセージ 242 が表示され、smalldatetime 値が NULL に設定されます。

次のコードは、date 値を smalldatetime 値に変換した結果を示しています。

DECLARE @date date
DECLARE @smalldatetime smalldatetime
SELECT @date = '1912-10-25'
SELECT @smalldatetime = @date
SELECT @date AS '@date', @smalldatetime AS '@smalldatetime'
--Result
--@date      @smalldatetime
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00
--
--(1 row(s) affected)

datetimeoffset(n)

日付がコピーされ、時刻が 00:00.0000000 +00:00 に設定されます。

次のコードは、date 値を datetimeoffset(3) 値に変換した結果を示しています。

DECLARE @date date
DECLARE @datetimeoffset datetimeoffset(3)
SELECT @date = '1912-10-25'
SELECT @datetimeoffset = @date
SELECT @date AS '@date', @datetimeoffset AS '@datetimeoffset'
--Result
--@date      @datetimeoffset
------------ ------------------------------
--1912-10-25 1912-10-25 00:00:00.000 +00:00
--
--(1 row(s) affected)

datetime2(n)

日付部分がコピーされ、時刻部分が 00:00.000000 に設定されます。

次のコードは、date 値を datetime2(3) 値に変換した結果を示しています。

DECLARE @date date
DECLARE @datetime2 datetime2(3)
SELECT @date = '1912-10-25'
SELECT @datetime2 = @date
SELECT @date AS '@date', @datetime2 AS '@datetime2(3)'
--Result
--@date      @datetime2(3)
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00.000
--
--(1 row(s) affected)

time(n) データ型

次の表では、time データ型が他の日付および時刻データ型に変換される場合の処理について説明します。

変換先のデータ型

変換の詳細

time(n)

時間、分、および秒がコピーされます。変換先の有効桁数が変換元の有効桁数未満の場合は、秒の小数部が変換先の有効桁数に合わせて切り捨てられます。

次の例は、time(4) 値を time(3) 値に変換した結果を示しています。

DECLARE @timeTo time(3)
DECLARE @timeFrom time(4)
SELECT @timeFrom = '12:34:54.1234'
SELECT @timeTo = @TimeFrom
SELECT @timeTo AS 'time(3)', @timeFrom AS 'time(4)'
--Results
--time(3)      time(4)
-------------- -------------
--12:34:54.123 12:34:54.1234
--
--(1 row(s) affected)

date

変換が失敗し、"オペランド型の不整合: date は time と互換性がありません" というエラー メッセージ 206 が表示されます。

datetime

時間、分、および秒の値がコピーされ、日付部分が '1900-01-01' に設定されます。time(n) 値の秒の小数部の有効桁数が 3 桁を超える場合、datetime の結果は切り捨てられます。

次のコードは、time(4) 値を datetime 値に変換した結果を示しています。

DECLARE @time time(4)
DECLARE @datetime datetime
SELECT @time = '12:15:04.1234'
SELECT @datetime = @time
SELECT @time AS '@time', @datetime AS '@datetime'
--Result
--@time         @datetime
--------------- -----------------------
--12:15:04.1234 1900-01-01 12:15:04.123
--
--(1 row(s) affected)

smalldatetime

日付が '1900-01-01' に設定され、時間と分の値がコピーされます。秒と秒の小数部は 0 に設定されます。

次のコードは、time(4) 値を smalldatetime 値に変換した結果を示しています。

DECLARE @time time(4)
DECLARE @smalldatetime smalldatetime
SELECT @time = '12:15:04.1234'
SELECT @smalldatetime = @time
SELECT @time AS '@time', @smalldatetime AS '@smalldatetime'
--Result
--@time         @smalldatetime
--------------- -----------------------
--12:15:04.1234 1900-01-01 12:15:00
--
--(1 row(s) affected)

datetimeoffset(n)

日付が '1900-01-01' に設定され、時刻がコピーされます。タイム ゾーン オフセットが +00:00 に設定されます。time(n) 値の秒の小数部の有効桁数が datetimeoffset(n) 値の有効桁数を超える場合、値はその桁数に合わせて切り捨てられます。

次の例は、time(4) 値を datetimeoffset(3) 型に変換した結果を示しています。

DECLARE @time time(4)
DECLARE @datetimeoffset datetimeoffset(3)
SELECT @time = '12:15:04.1234'
SELECT @datetimeoffset = @time
SELECT @time AS '@time', @datetimeoffset AS '@datetimeoffset'
--Result
--@time         @datetimeoffset
--------------- ------------------------------
--12:15:04.1234 1900-01-01 12:15:04.123 +00:00
--
--(1 row(s) affected)

datetime2(n)

日付が '1900-01-01' に設定され、時刻部分がコピーされ、タイム ゾーン オフセットが 00:00 に設定されます。datetime2(n) 値の秒の小数部の有効桁数が time(n) 値を超える場合、値はその桁数に合わせて切り捨てられます。

次の例は、time(4) 値を datetime2(2) 値に変換した結果を示しています。

DECLARE @time time(4)
DECLARE @datetime2 datetime2(3)
SELECT @time = '12:15:04.1234'
SELECT @datetime2 = @time
SELECT @datetime2 AS '@datetime2', @time AS '@time'
--Result
--@datetime2              @time
------------------------- -------------
--1900-01-01 12:15:04.123 12:15:04.1234
--
--(1 row(s) affected)

datetime データ型

次の表では、datetime データ型が他の日付および時刻データ型に変換される場合の処理について説明します。

変換先のデータ型

変換の詳細

date

年、月、日がコピーされます。時刻部分は 00:00:00.000 に設定されます。

次のコードは、date 値を datetime 値に変換した結果を示しています。

DECLARE @date date
DECLARE @datetime datetime
SELECT @date = '12-21-05'
SELECT @datetime = @date
SELECT @datetime AS '@datetime', @date AS '@date'
--Result
--@datetime               @date
------------------------- ----------
--2005-12-21 00:00:00.000 2005-12-21

time(n)

時刻部分がコピーされ、日付部分が '1900-01-01' に設定されます。time(n) 値の小数部の有効桁数が 3 桁を超える場合、値はその桁数に合わせて切り捨てられます。

次の例は、time(4) 値を datetime 値に変換した結果を示しています。

DECLARE @time time(4)
DECLARE @datetime datetime
SELECT @time = '12:10:05.1234'
SELECT @datetime = @time
SELECT @datetime AS '@datetime', @time AS '@time'
--Result
--@datetime               @time
------------------------- -------------
--1900-01-01 12:10:05.123 12:10:05.1234
--
--(1 row(s) affected)

smalldatetime

時間と分がコピーされます。秒と秒の小数部は 0 に設定されます。

次のコードは、smalldatetime 値を datetime 値に変換した結果を示しています。

DECLARE @smalldatetime smalldatetime
DECLARE @datetime datetime
SELECT @smalldatetime = '12-01-01 12:32'
SELECT @datetime = @smalldatetime
SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime'
--Result
--@datetime               @smalldatetime
------------------------- -----------------------
--2001-12-01 12:32:00.000 2001-12-01 12:32:00
--
--(1 row(s) affected)

datetimeoffset(n)

日付部分と時刻部分がコピーされます。タイム ゾーンは切り捨てられます。datetimeoffset(n) 値の小数部の有効桁数が 3 桁を超える場合、値は切り捨てられます。

次の例は、datetimeoffset(4) 値を datetime 値に変換した結果を示しています。

DECLARE @datetimeoffset datetimeoffset(4)
DECLARE @datetime datetime
SELECT @datetimeoffset = '1968-10-23 12:45:37.1234 +10:0'
SELECT @datetime = @datetimeoffset
SELECT @datetime AS '@datetime', @datetimeoffset AS '@datetimeoffset'
--Result
--@datetime               @datetimeoffset
------------------------- ------------------------------
--1968-10-23 12:45:37.123 1968-10-23 12:45:37.1234 +01:0
--
--(1 row(s) affected)

datetime2(n)

日付と時刻がコピーされます。datetime2(n) 値の小数部の有効桁数が 3 桁を超える場合、値は切り捨てられます。

次の例は、datetime2(4) 値を datetime 値に変換した結果を示しています。

DECLARE @datetime2 datetime2(4)
DECLARE @datetime datetime
SELECT @datetime2 = '1968-10-23 12:45:37.1237'
SELECT @datetime = @datetime2
SELECT @datetime AS '@datetime', @datetime2 AS '@datetime2'
--Result
--@datetime               @datetime2
------------------------- ------------------------
--1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237
--
--(1 row(s) affected)

smalldatetime データ型

次の表では、smalldatetime データ型が他の日付および時刻データ型に変換される場合の処理について説明します。

変換先のデータ型

変換の詳細

date

年、月、日がコピーされます。

次のコードは、smalldatetime 値を date 値に変換した結果を示しています。

DECLARE @smalldatetime smalldatetime
DECLARE @date date
SELECT @smalldatetime = '1955-12-13 12:43:10'
SELECT @date = @smalldatetime
SELECT @smalldatetime AS '@smalldatetime', @date AS 'date'
--Result
--@smalldatetime          date
------------------------- ----------
--1955-12-13 12:43:00     1955-12-13
--
--(1 row(s) affected)

time(n)

時間、分、および秒がコピーされます。秒の小数部は 0 に設定されます。

次のコードは、smalldatetime 値を time(4) 値に変換した結果を示しています。

DECLARE @smalldatetime smalldatetime
DECLARE @time time(4)
SELECT @smalldatetime = '1955-12-13 12:43:10'
SELECT @time = @smalldatetime
SELECT @smalldatetime AS '@smalldatetime', @time AS 'time'
--Result
--@smalldatetime          time
------------------------- -------------
--1955-12-13 12:43:00     12:43:00.0000
--
--(1 row(s) affected)

datetime

smalldatetime 値が datetime 値にコピーされます。秒の小数部は 0 に設定されます。

次のコードは、smalldatetime 値を datetime 値に変換した結果を示しています。

DECLARE @smalldatetime smalldatetime
DECLARE @datetime datetime
SELECT @smalldatetime = '1955-12-13 12:43:10'
SELECT @datetime = @smalldatetime
SELECT @smalldatetime AS '@smalldatetime', @datetime AS 'datetime'
--Result
--@smalldatetime          datetime
------------------------- -----------------------
--1955-12-13 12:43:00     1955-12-13 12:43:00.000
--
--(1 row(s) affected)

datetimeoffset(n)

smalldatetime 値が datetimeoffset(n) 値にコピーされます。秒の小数部は 0 に設定され、タイム ゾーン オフセットは +00:0 に設定されます。

次のコードは、smalldatetime 値を datetimeoffset(4) 値に変換した結果を示しています。

DECLARE @smalldatetime smalldatetime
DECLARE @datetimeoffset datetimeoffset(4)
SELECT @smalldatetime = '1955-12-13 12:43:10'
SELECT @datetimeoffset = @smalldatetime
SELECT @smalldatetime AS '@smalldatetime', @datetimeoffset AS 'datetimeoffset(4)'
--Result
--@smalldatetime          datetimeoffset(4)
------------------------- ------------------------------
--1955-12-13 12:43:00     1955-12-13 12:43:00.0000 +00:0
--
--(1 row(s) affected)

datetime2(n)

smalldatetime 値が datetime2(n) 値にコピーされます。秒の小数部は 0 に設定されます。

次のコードは、smalldatetime 値を datetime2(4) 値に変換した結果を示しています。

DECLARE @smalldatetime smalldatetime
DECLARE @datetime2 datetime2(4)
SELECT @smalldatetime = '1955-12-13 12:43:10'
SELECT @datetime2 = @smalldatetime
SELECT @smalldatetime AS '@smalldatetime', @datetime2 AS ' datetime2(4)'
--Result
--@smalldatetime           datetime2(4)
------------------------- ------------------------
--1955-12-13 12:43:00     1955-12-13 12:43:00.0000
--
--(1 row(s) affected)

datetimeoffset(n) データ型

次の表では、datetimeoffset(n) データ型が他の日付および時刻データ型に変換される場合の処理について説明します。

変換先のデータ型

変換の詳細

date

年、月、日がコピーされます。

次のコードは、datetimeoffset(4) 値を date 値に変換した結果を示しています。

DECLARE @datetimeoffset datetimeoffset(4)
DECLARE @date date
SELECT @datetimeoffset = '12-10-25 12:32:10 +01:0'
SELECT @date = @datetimeoffset
SELECT @datetimeoffset AS '@datetimeoffset ', @date AS 'date'
--Result
--@datetimeoffset                date
-------------------------------- ----------
--2025-12-10 12:32:10.0000 +01:0 2025-12-10
--
--(1 row(s) affected)

time(n)

時間、分、秒、および秒の小数部がコピーされます。タイム ゾーンの値は切り捨てられます。datetimeoffset(n) 値の有効桁数が time(n) 値の有効桁数を超える場合、値は切り捨てられます。

次のコードは、datetimeoffset(4) 値を time(3) 値に変換した結果を示しています。

DECLARE @datetimeoffset datetimeoffset(4)
DECLARE @time time(3)
SELECT @datetimeoffset = '12-10-25 12:32:10.1234 +01:0'
SELECT @time = @datetimeoffset
SELECT @datetimeoffset AS '@datetimeoffset ', @time AS 'time'
--Result
--@datetimeoffset                time
-------------------------------- ------------
--2025-12-10 12:32:10.1234 +01:0 12:32:10.123
--
--(1 row(s) affected)

datetime

日付と時刻の値がコピーされ、タイム ゾーンが切り捨てられます。datetimeoffset(n) 値の小数部の有効桁数が 3 桁を超える場合、値は切り捨てられます。

次のコードは、datetimeoffset(4) 値を datetime 値に変換した結果を示しています。

DECLARE @datetimeoffset datetimeoffset(4)
DECLARE @datetime datetime
SELECT @datetimeoffset = '12-10-25 12:32:10.1234 +01:0'
SELECT @datetime = @datetimeoffset
SELECT @datetimeoffset AS '@datetimeoffset ', @datetime AS 'datetime'
--Result
--@datetimeoffset                datetime
-------------------------------- -----------------------
--2025-12-10 12:32:10.1234 +01:0 2025-12-10 12:32:10.123
--
--(1 row(s) affected)

smalldatetime

日付、時間、および分がコピーされます。秒は 0 に設定されます。

次のコードは、datetimeoffset(3) 値を smalldatetime 値に変換した結果を示しています。

DECLARE @datetimeoffset datetimeoffset(3)
DECLARE @smalldatetime smalldatetime
SELECT @datetimeoffset = '1912-10-25 12:24:32 +10:0'
SELECT @smalldatetime = @datetimeoffset
SELECT @datetimeoffset AS '@datetimeoffset', @smalldatetime AS '@smalldatetime'
--Result
--@datetimeoffset                @smalldatetime
-------------------------------- -----------------------
--1912-10-25 12:24:32.000 +10:00 1912-10-25 12:25:00
--
--(1 row(s) affected)

datetime2(n)

日付と時刻が datetime2 値にコピーされ、タイム ゾーンが切り捨てられます。datetime2(n) 値の有効桁数が datetimeoffset(n) 値の有効桁数を超える場合、秒の小数部はその桁数に合わせて切り捨てられます。

次のコードは、datetimeoffset(4) 値を datetime2(3) 値に変換した結果を示しています。

DECLARE @datetimeoffset datetimeoffset(4)
DECLARE @datetime2 datetime2(3)
SELECT @datetimeoffset = '1912-10-25 12:24:32.1234 +10:0'
SELECT @datetime2 = @datetimeoffset
SELECT @datetimeoffset AS '@datetimeoffset', @datetime2 AS '@datetime2'
--Result
--@datetimeoffset                @datetime2
-------------------------------- -----------------------
--1912-10-25 12:24:32.1234 +10:0 1912-10-25 12:24:32.123
--
--(1 row(s) affected)

datetime2 データ型

次の表では、datetime2 データ型が他の日付および時刻データ型に変換される場合の処理について説明します。

変換先のデータ型

変換の詳細

date

年、月、日がコピーされます。

次のコードは、datetime2(4) 値を date 値に変換した結果を示しています。

DECLARE @datetime2 datetime2(4)
DECLARE @date date
SELECT @datetime2 = '12-10-25 12:32:10.1234'
SELECT @date = @datetime2
SELECT @datetime2 AS '@datetime2', @date AS 'date'
--Result
--@datetime2               date
-------------------------- ----------
--2025-12-10 12:32:10.1234 2025-12-10
--
--(1 row(s) affected)

time(n)

時間、分、秒、および秒の小数部がコピーされます。

次のコードは、datetime2(4) 値を time(3) 値に変換した結果を示しています。

DECLARE @datetime2 datetime2(4)
DECLARE @time time(3)
SELECT @datetime2 = '12-10-25 12:32:10.1234'
SELECT @time = @datetime2
SELECT @datetime2 AS '@datetime2', @time AS 'time(3)'
--Result
--@datetime2                time(3) 
-------------------------- ------------
--2025-12-10 12:32:10.1234 12:32:10.123
--
--(1 row(s) affected)

datetime

日付と時刻の値がコピーされます。datetimeoffset(n) 値の小数部の有効桁数が 3 桁を超える場合、値は切り捨てられます。

次のコードは、datetime2 値を datetime 値に変換した結果を示しています。

DECLARE @datetime2 datetime2
DECLARE @datetime datetime
SELECT @datetime2 = '12-10-25 12:32:10.1234567'
SELECT @datetime = @datetime2
SELECT @datetime2 AS '@datetime2', @datetime AS '@datetime'
--Result
--@datetime2                  @datetime
----------------------------- -----------------------
--2025-12-10 12:32:10.1234567 2025-12-10 12:32:10.123
--
--(1 row(s) affected)

smalldatetime

日付、時間、および分がコピーされます。秒は 0 に設定されます。

次のコードは、datetime2 値を smalldatetime 値に変換した結果を示しています。

DECLARE @datetime2 datetime2
DECLARE @smalldatetime smalldatetime
SELECT @datetime2 = '12-10-25 12:32:10.1234567'
SELECT @smalldatetime = @datetime2
SELECT @datetime2 AS '@datetime2', @smalldatetime AS '@smalldatetime'
--Result
--@datetime2                  @datetime
----------------------------- -----------------------
--2025-12-10 12:32:10.1234567 2025-12-10 12:32:10.123
--
--(1 row(s) affected)

datetimeoffset(n)

datetime2(n) 値が datetimeoffset(n) 値にコピーされます。タイム ゾーン オフセットが +00:0 に設定されます。datetime2(n) 値の有効桁数が datetimeoffset(n) 値の有効桁数を超える場合、値はその桁数に合わせて切り捨てられます。

次のコードは、datetime2(5) 値を datetimeoffset(3) 値に変換した結果を示しています。

DECLARE @datetime2 datetime2(3)
DECLARE @datetimeoffset datetimeoffset(2)
SELECT @datetime2 = '12-10-25 12:32:10.1234567'
SELECT @datetimeoffset = @datetime2
SELECT @datetime2 AS '@datetime2', @datetimeoffset AS '@datetimeoffset(2)'
--Result
--@datetime2              @datetimeoffset(2)
------------------------- -----------------------------
--2025-12-10 12:32:10.123 2025-12-10 12:32:10.12 +00:00
--
--(1 row(s) affected)

time、date、datetime2、および datetimeoffset での CAST と CONVERT の使用

ここでは、日付/時刻データ型間の変換について説明します。

datetimeoffset への変換

  • タイム ゾーンを含まない値をタイム ゾーンを含む datetimeoffset 値に暗黙的に変換すると (単純な代入演算など)、タイム ゾーンを含まない値はローカルとして扱われ、そこから現在の既定のタイム ゾーン (00:00) のオフセットを引いて UTC が計算されます。
  1. 次のような変換でタイム ゾーンを含まないデータ型を datetimeoffset に変換すると、常に UTC タイム ゾーン (00:00) が追加されます。
  • date から datetimeoffset

  • time から datetimeoffset

  • datetime2 から datetimeoffset

  • datetime または smalldatetime から datetimeoffset

  • タイム ゾーン形式を含まない有効な date、time、または datetime の文字列リテラルから datetimeoffset

datetimeoffset からの変換

datetimeoffset から以下のタイム ゾーンを含まないデータ型への変換を行うと、date、time、datetime2、datetime、または smalltime の戻り値は、スタイル 0 (既定) の場合は常に保持されたタイム ゾーン オフセットのローカル形式になり、スタイル 1 の場合は常に UTC 形式になります。

以下のようにタイム ゾーンを含まない日付値や時刻値に暗黙的に変換される場合、datetimeoffset 値は常に UTC として扱われます。その値に、保持されたタイム ゾーン オフセットが加算されて、ローカル時間が計算されます。その結果、タイム ゾーン オフセットを含まないローカル時間が得られます。

  • datetimeoffset から date

  • datetimeoffset から time

  • datetimeoffset から datetime2

  • datetimeoffset から datetime または smalldatetime

  • 0 および 1 のスタイルを使用して datetimeoffset を文字列に変換することはできません。代わりに、datetimeoffset を datetime2 または datetime に変換してから、varchar または char に変換します。

既存の CONVERT スタイルに時刻部分が含まれている場合に datetimeoffset から文字列への変換を行うと、タイム ゾーン オフセットが含まれます (スタイル 127 を除く)。タイム ゾーン オフセットが不要な場合は、datetime2 にキャストしてから文字列にキャストします。

datetimeoffset から文字列への変換では常にすべての既存の日付/時刻スタイルが適用されます。タイム ゾーン オフセットも保持されます。

入力文字列のタイム ゾーン オフセットの部分は、hh と mm の両方が常に 2 桁である必要があります。+ または – の符号も必須です。

変換で破棄される情報

  • datetime2 または datetimeoffset から date に変換すると、丸め処理は行われず、日付部分が明示的に抽出されます。datetimeoffset の場合、この抽出は UTC 値ではなくローカルの日付と時刻で行われます。

  • datetimeoffset から date、time、datetime2、datetime、または smalldatetime への暗黙的な変換では、ローカルの日付/時刻値に基づいて (保持されたタイム ゾーン オフセットに対して) 変換が行われます。たとえば、datetimeoffset(3) 値 2006-10-21 12:20:20.999 -8:00 を time(3) に変換すると、結果は 20:20:20.999(UTC) ではなく 12:20:20.999 になります。

変換における切り捨て

  • 高い精度の時刻値を低い精度の値に変換することができます。高い精度の値は低い精度の型に合わせて切り捨てられます。

秒の小数部の変換

スタイルに時刻形式 hh:mm:ss.mmm が含まれている場合、その形式は、time(n)、datetime2(n)、および datetimeoffset(n) では hh:mm:ss.[nnnnnnn] になります。桁の数は、型指定によって異なります。ミリ秒単位の精度のみが必要な場合は、datetime2(3) に変換してから文字列に変換します。

スタイル 9、109、13、113、21、121、130、および 131 では、秒の小数部の先頭を区切るコロン (:) が、time 型、datetime2 型、および datetimeoffset 型の文字列変換でサポートされません。これらのスタイルを使用した場合、出力文字列の形式はピリオド (.) に変換されます。

CONVERT 関数のスタイル引数

CONVERT 関数のスタイル引数に対応する date 値、time 値、datetime2 値、および datetimeoffset 値の例を次の表に示します。スタイルの詳細については、「CAST および CONVERT (Transact-SQL)」の「引数」のセクションを参照してください。

スタイル

Associated standard

Input/Output (3)

format

date

time(n)

datetime2(n)

datetimeoffset(n)

0 または 100 (1、2)

既定

mon dd yyyy hh:miAM (または PM)

Jan 1 2001

12:20PM

Jan 1 2001 12:20PM

Jan 1 2001 12:20PM -08:00

101

米国

mm/dd/yyyy

01/01/2001

-

01/01/2001

01/01/2001

102

ANSI

yy.mm.dd

2001.01.01

-

2001.01.01

2001.01.01

103

イギリス/フランス

dd/mm/yy

01/01/2001

-

01/01/2001

01/01/2001

104

ドイツ

dd.mm.yy

01.01.2001

-

01.01.2001

01.01.2001

105

イタリア

dd-mm-yy

01-01-2001

-

01-01-2001

01-01-2001

106(1)

-

dd mon yy

01 Jan 2001

-

01 Jan 2001

01 Jan 2001

107(1)

-

Mon dd, yy

Jan 01, 2001

-

Jan 01, 2001

Jan 01, 2001

108

-

hh:mi:ss

-

12:20:20

12:20:20

12:20:20

9 または 109 (1、2)

既定値 + ミリ秒

mon dd yyyy hh:mi:ss:mmmAM (または PM)

Jan 1 2001

12:20:20.1234567AM

Jan 1 2001 12:20:20.1234567PM

Jan 1 2001 12:20:20:1230000PM -08:00

110

米国

mm-dd-yy

01-01-2001

-

01-01-2001

01-01-2001

111

日本

yy/mm/dd

2001/01/01

-

2001/01/01

2001/01/01

112

ISO

yymmdd

20010101

-

20010101

20010101

13 または 113 (1、2)

ヨーロッパの既定値 + ミリ秒

dd mon yyyy hh:mi:ss:mmm(24h)

01 Jan 2001

12:20:20.1234567

01 Jan 2001 12:20:20.1234567

01 Jan 2001 12:20:20:1230000 -08:00

114

-

hh:mi:ss:mmm(24h)

-

12:20:20.1234567

12:20:20.1234567

12:20:20:1230000 -08:00

20 または 120 (2)

ODBC 標準

yyyy-mm-dd hh:mi:ss(24h)

2001-01-01

12:20:20

2001-01-01 12:20:20

2001-01-01 12:20:20 -08:00

21 または 121 (2)

ODBC 標準 (ミリ秒を含む)

yyyy-mm-dd hh:mi:ss.mmm(24h)

2001-01-01

12:20:20.1234567

2001-01-01 12:20:20.1234567

2001-01-01 12:20:20.1230000 -08:00

126 (4)

ISO8601

yyyy-mm-ddThh:mi:ss.mmm (スペースなし)

2001-01-01

12:20:20.1234567

2001-01-01T 12:20:20.1234567

2001-01-01T 12:20:20.1234567

127(6, 7)

ISO 8601 (タイム ゾーン Z)

yyyy-mm-ddThh:mi:ss.mmmZ

(スペースなし)

2001-01-01

12:20:20.1234567Z

2001-01-01T 12:20:20.1234567Z

2001-01-01T20:20:20.1230000Z

130 (1,2)

Hijri (5)

dd mon yyyy hh:mi:ss:mmmAM

01 Jan 2001

12:20:20.1230000PM

01 Jan 2001 12:20:20.1230000PM

1 Jan 2001 12:20:20:1230000PM -08:00

131 (2)

Hijri (5)

dd/mm/yy hh:mi:ss:mmmAM

01/01/2001

12:20:20.1230000PM

01/01/2001 12:20:20.1230000PM

01/01/2001 12:20:20.1230000PM -08:00

1 これらのスタイル値で返される結果は非決定的です。この場合は、すべての (yy) (2 桁の年) スタイルと、(yyyy) (4 桁の年) スタイルのサブセットが対象となります。

2 既定値 (style0 または 1009 または 10913 または 11320 または 12021 または 121) では、常に 4 桁の年 (yyyy) が返されます。

3datetime 型に変換する場合は入力になり、文字データに変換する場合は出力になります。

4 XML で使用するよう設計されています。datetime または smalldatetime 型から文字データに変換する場合の出力形式は、前の表に示したとおりです。

5 Hijri とはいくつかのバリエーションがあるカレンダー システムです。SQL Server ではクウェート アルゴリズムが使用されます。

6 文字データを datetime または smalldatetime 型にキャストする場合のみサポートされます。日付部分または時刻部分のみを表す文字データは、datetime または smalldatetime データ型にキャストされます。時刻部分の指定がない場合、時刻は 00:00:00:000 に設定され、日付部分の指定がない場合、日付は 1900-01-01 に設定されます。

7 タイム ゾーン インジケータ Z は省略可能です。これを使用すると、タイム ゾーン情報が含まれる XML の datetime 値から、タイム ゾーン情報が含まれない SQL Serverdatetime 値へのマップが容易になります。Z は、タイム ゾーン UTC-0 を示すインジケータです。

SQL Server の日付/時刻の制限

以下の "日付" および "時刻" は、日付部分または時刻部分を含む任意の日付/時刻データ型を表します。

  • datetimeoffset の夏時間 (DST) はサーバー側ではサポートされません。

  • 日付でユリウス暦はサポートされません。

  • 時刻で午前 0 時を "24" 時と表現することはできません。

  • 時刻でサポートされる "うるう秒" は "59" までです。

  • 時刻でサポートされる秒の小数部の精度は "1 ナノ秒" 未満までです。

  • 時刻でタイム ゾーンはサポートされません。

  • SQL 標準の INTERVAL 操作はサポートされません。

下位クライアントの下位互換性

一部の下位クライアントは、time 型、date 型、datetime2 型、および datetimeoffset 型をサポートしていません。これらのデータ型は、SQL Server 2008 で追加されたものです。SQL Server 2008 の上位インスタンスと下位クライアントの間のデータ型マッピングを次の表に示します。

SQL Server 2008 のデータ型

下位クライアントに渡される既定の文字列リテラル形式

下位 ODBC

下位 OLEDB

下位 JDBC

下位 SQLCLIENT

time

hh:mm:ss[.nnnnnnn]

SQL_WVARCHAR または SQL_VARCHAR

DBTYPE_WSTR または DBTYPE_STR

Java.sql.String

String または SqString

date

YYYY-MM-DD

SQL_WVARCHAR または SQL_VARCHAR

DBTYPE_WSTR または DBTYPE_STR

Java.sql.String

String または SqString

datetime2

YYYY-MM-DD hh:mm:ss[.nnnnnnn]

SQL_WVARCHAR または SQL_VARCHAR

DBTYPE_WSTR または DBTYPE_STR

Java.sql.String

String または SqString

datetimeoffset

YYYY-MM-DD hh:mm:ss[.nnnnnnn] [+|-]hh:mm

SQL_WVARCHAR または SQL_VARCHAR

DBTYPE_WSTR または DBTYPE_STR

Java.sql.String

String または SqString

A. 日付および時刻データ型の比較

次の例では、文字列リテラルをそれぞれの日付および時刻データ型にキャストした結果を比較します。秒の小数部の精度が smalldatetime または datetime で許容される範囲を超えている文字列リテラルを CAST でキャストしようとすると、エラーが発生します。

SELECT 
     CAST('2007-05-08 12:35:29. 1234567 +12:15' AS time(7)) AS 'time' 
    ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS date) AS 'date' 
    ,CAST('2007-05-08 12:35:29.123' AS smalldatetime) AS 
        'smalldatetime' 
    ,CAST('2007-05-08 12:35:29.123' AS datetime) AS 'datetime' 
    ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS datetime2(7)) AS 
        'datetime2'
    ,CAST('2007-05-08 12:35:29.1234567 +12:15' AS datetimeoffset(7)) AS 
        'datetimeoffset';

データ型

出力

Time

12:35:29.1234567

Date

2007-05-08

Smalldatetime

2007-05-08 12:35:00

Datetime

2007-05-08 12:35:29.123

datetime2(7)

2007-05-08 12:35:29.1234567

datetimeoffset(7)

2007-05-08 12:35:29.1234567 +12:15

B. 現在のシステム日付と時刻の取得

次の例では、現在の日付と時刻を返す SQL Server システム関数の使用方法を示します。

SELECT SYSDATETIME() AS 'SYSDATETIME'

--Results
--SYSDATETIME
--2007-10-22 14:10:41.7984554
--(1 row(s) affected)

SELECT SYSDATETIMEOFFSET() AS 'SYSDATETIMEOFFSET'

--Results
--SYSDATETIMEOFFSET
--2007-10-22 14:11:34.2607172 -0
--(1 row(s) affected)

SELECT SYSUTCDATETIME() AS 'SYSUTCDATETIME'

--Results
--SYSUTCDATETIME
--2007-10-22 21:12:11.7069470
--(1 row(s) affected)

SELECT CURRENT_TIMESTAMP AS 'CURRENT_TIMESTAMP'

--Results
--CURRENT_TIMESTAMP
-------------------------
--2007-10-22 14:12:33.320
--(1 row(s) affected)

SELECT GETDATE() AS 'GETDATE'

--Results
--GETDATE
--2007-10-22 14:13:57.943
--(1 row(s) affected)

SELECT GETUTCDATE() AS 'GETUTCDATE'

--Results
--GETUTCDATE
--2007-10-22 21:14:35.657
--(1 row(s) affected)

C. 1 日のすべての datetime2 値の検索

  • 次の例では、1 日のすべての日付と時刻の値を検索する方法を示します。
-- Create a table that contains with the following dates:
--     The last date-time in 2005-04-06, '2005-04-06 23:59:59.9999999'
--     The first date-time in 2005-04-07, '2005-04-07 00:00:00.0000000'
--     The last date-time in 2005-04-07, '2005-04-07 23:59:59.9999999'
--     The first date-time in 2005-04-08, '2005-04-08 00:00:00.0000000'
CREATE TABLE #Search
    (
    MyDate datetime2
    );
INSERT INTO #Search(MyDate)VALUES('2005-04-06 23:59:59.9999999');
INSERT INTO #Search(MyDate)VALUES('2005-04-07 00:00:00.0000000');
INSERT INTO #Search(MyDate)VALUES('2005-04-07 23:59:59.9999999');
INSERT INTO #Search(MyDate)VALUES('2005-04-08 00:00:00.0000000');

-- The following four SELECT statements show different ways to find
-- only the two rows that contain 2005-04-07 dates.
--Use CONVERT.
SELECT MyDate 
FROM #Search 
WHERE CONVERT(date,MyDate) = '2005-04-07';

--Use >= and <=.
SELECT MyDate 
FROM #Search 
WHERE MyDate >= '2005-04-07 00:00:00.0000000' 
    AND MyDate <= '2005-04-07 23:59:59.9999999';

--Use > and <.
SELECT MyDate
FROM #Search
WHERE MyDate > '2005-04-06 23:59:59.9999999'
    AND MyDate < '2005-04-08 00:00:00.0000000';

--Use BETWEEN AND.
SELECT MyDate
FROM #Search
WHERE MyDate BETWEEN '2005-04-07 00:00:00.0000000'
    AND '2005-04-07 23:59:59.9999999';
DROP TABLE #Search
GO

D. 1 日の時間範囲の検索

次の例では、時刻値を含む日付を検索して時間範囲を検索する方法を示します。

-- Create a table called Search and insert
-- five different time values for the same
-- date.

CREATE TABLE #Search
    (
    MyDate datetime2
    );

INSERT INTO #Search(MyDate)VALUES('2005-04-06 08:59:59.9999999');
INSERT INTO #Search(MyDate)VALUES('2005-04-06 09:00:00.0000000');
INSERT INTO #Search(MyDate)VALUES('2005-04-06 09:00:00.9999999');
INSERT INTO #Search(MyDate)VALUES('2005-04-06 16:59:59.9999999');
INSERT INTO #Search(MyDate)VALUES('2005-04-06 17:00:00.0000000');

-- The following SELECT statements show different ways
-- to search for dates that have time values to find a
-- time range.

--Using CONVERT with time (0) to ignore fractional seconds
SELECT MyDate 
FROM #Search 
WHERE CONVERT(time(0),MyDate) = '09:00:00';

--Returns two rows (ignores fractional seconds):
--2005-04-06 08:59:59.9999999
--2005-04-06 09:00:00.0000000

--Using CONVERT with time (7) to include fractional seconds
SELECT MyDate 
FROM #Search 
WHERE CONVERT(time(7),MyDate) = '09:00:00';

--Returns one row (matches fractional seconds):
--2005-04-06 09:00:00.0000000


--Each of the SELECT statements below use CONVERT
--to find all times in an eight-hour period.

--Use CONVERT with >= and <=.
SELECT MyDate 
FROM #Search 
WHERE CONVERT(time(7),MyDate) >=  '09:00:00.0000000'
    AND CONVERT(time(7),MyDate) <= '16:59:59.9999999'

--Use CONVERT with > and <.
SELECT MyDate
FROM #Search
WHERE CONVERT(time(7),MyDate) > '08:59:59.9999999'
    AND CONVERT(time(7),MyDate) < '17:00:00.0000000';

--Use CONVERT with BETWEEN AND
SELECT MyDate
FROM #Search
WHERE CONVERT(time(7),MyDate) BETWEEN '09:00:00.0000000'
    AND '16:59:59.9999999';
DROP TABLE #Search
GO

E. DATEPART と DATEADD による datepart の最初の日付と最後の日付の検索

次の例では、datepart の最初の日付または最後の日付を返す方法を示します。

-- When several months, quarters, or years are added to the base
-- year,1900-01-01, the returned day is the first day of a month.
-- To calculate the last day of the current month, you need to
--
-- 1. Find the difference in months between today and the base
--    year (0 ='1900-01-01'). This is accomplished by
--
-- DATEDIFF(month, 0, SYSDATETIME())
-- 2. Add that number of months plus 1 to the base year (0)
--    to obtain the first day of the next month.
--    DATEADD(month, DATEDIFF(month, 0, SYSDATETIME()) + 1, 0)
-- 3. Subtract 1 day.
--
--Find the first day of the current month.
SELECT DATEADD(month, DATEDIFF(month, 0, SYSDATETIME()), 0);

--Find the last day of the current month.
SELECT DATEADD(month, DATEDIFF(month, 0, SYSDATETIME()) + 1, 0) - 1;

-- Find the first day of the current quarter.
SELECT DATEADD(quarter, DATEDIFF(quarter, 0, SYSDATETIME()), 0);

-- Find the last day of the current quarter.
SELECT DATEADD(quarter, DATEDIFF(quarter, -1, SYSDATETIME()), -1);

-- Find the first day of the current year.
SELECT DATEADD(year, DATEDIFF(year, 0, SYSDATETIME()), 0);

-- Find the last day of the current year.
SELECT DATEADD(year, DATEDIFF(year, -1, SYSDATETIME()), -1);

F. DATEADD、DATEDIFF、DATENAME、および DATEPART でのユーザー定義の datepart 引数の使用

次の例では、datetime2 値の一部に定数を追加するユーザー定義のスカラ関数を作成します。

USE tempdb
GO
CREATE FUNCTION UserDateadd
    (
    @datepart nvarchar(11)
    ,@number int 
    ,@date datetime2
    )
RETURNS datetime2
AS
BEGIN
    DECLARE @Return datetime2

    SELECT @Return = CASE @datepart
        WHEN 'year' THEN DATEADD(year,@number,@date) 
        WHEN 'yy' THEN DATEADD(year,@number,@date) 
        WHEN 'yyyy' THEN DATEADD(year,@number,@date) 
        WHEN 'quarter' THEN DATEADD(quarter,@number,@date) 
        WHEN 'qq' THEN DATEADD(quarter,@number,@date) 
        WHEN 'month' THEN DATEADD(month,@number,@date) 
        WHEN 'mm' THEN DATEADD(month,@number,@date) 
        WHEN 'm' THEN DATEADD(month,@number,@date) 
        WHEN 'dayofyear' THEN DATEADD(dayofyear,@number,@date) 
        WHEN 'dy' THEN DATEADD(dayofyear,@number,@date) 
        WHEN 'y' THEN DATEADD(dayofyear,@number,@date) 
        WHEN 'day' THEN DATEADD(day,@number,@date) 
        WHEN 'dd' THEN DATEADD(day,@number,@date) 
        WHEN 'd' THEN DATEADD(day,@number,@date) 
        WHEN 'week' THEN DATEADD(week,@number,@date) 
        WHEN 'wk' THEN DATEADD(week,@number,@date) 
        WHEN 'ww' THEN DATEADD(week,@number,@date) 
        WHEN 'weekday' THEN DATEADD(weekday,@number,@date) 
        WHEN 'wk' THEN DATEADD(weekday,@number,@date) 
        WHEN 'w' THEN DATEADD(weekday,@number,@date) 
        WHEN 'hour' THEN DATEADD(hour,@number,@date) 
        WHEN 'hh' THEN DATEADD(hour,@number,@date) 
        WHEN 'minute' THEN DATEADD(minute,@number,@date)
        WHEN 'mi' THEN DATEADD(minute,@number,@date) 
        WHEN 'n' THEN DATEADD(minute,@number,@date)  
        WHEN 'second' THEN DATEADD(second,@number,@date) 
        WHEN 'ss' THEN DATEADD(second,@number,@date)
        WHEN 's' THEN DATEADD(second,@number,@date)
        WHEN 'millisecond' THEN DATEADD(millisecond,@number,@date) 
        WHEN 'ms' THEN DATEADD(millisecond,@number,@date) 
        WHEN 'microsecond' THEN DATEADD(microsecond,@number,@date)
        WHEN 'mcs' THEN DATEADD(microsecond,@number,@date)
        WHEN 'nanosecond' THEN DATEADD(nanosecond,@number,@date)
        WHEN 'ns' THEN DATEADD(nanosecond,@number,@date)
    END
    return @Return
END
GO

SELECT GetDate()
SELECT dbo.UserDateadd('year', 1, GetDate())
GO

G. DATEPART を使用した日付の部分によるグループ化

次の例では、AdventureWorks サンプル データベースを使用します。DATEPART を使用して、売上合計を曜日、月、年、および年/月/曜日でグループ化しています。

USE AdventureWorks
GO
SELECT SUM(TotalDue) AS 'Total Sales'
    ,DATEPART(year,OrderDate)AS 'By Year'
    ,DATEPART(month,OrderDate) AS 'By Month'
    ,DATEPART(weekday,OrderDate) AS 'By Weekday'
FROM Sales.SalesOrderHeader
WHERE YEAR(OrderDate) IN('2003','2004')
GROUP BY GROUPING SETS 
    (
    (DATEPART(year,OrderDate))
    ,(DATEPART(month,OrderDate))
    ,(DATEPART(weekday,OrderDate))
    ,(
        DATEPART(year,OrderDate)
        ,DATEPART(month,OrderDate),
        DATEPART(weekday,OrderDate))
    )
ORDER BY DATEPART(year,OrderDate)
    ,DATEPART(month,OrderDate)
    ,DATEPART(weekday,OrderDate)