datetime (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

24 時間形式の時刻 (1 秒未満の秒を含む) と組み合わせた日付を定義します。

Note

新しい作業には、timedatedatetime2datetimeoffsetデータタイプを使用してください。 これらの型は、SQL 標準に準拠しています。 これらの型は、移植性がより高いです。 timedatetime2datetimeoffset は秒の有効桁数が増えています。 datetimeoffset グローバルに配置されるアプリケーション向けにタイム ゾーンのサポートを提供します。

説明

プロパティ
構文 datetime
使用法 DECLARE @MyDatetime datetime

CREATE TABLE Table1 ( Column1 datetime )
既定の文字列リテラル形式

(下位クライアントに使用)
適用なし
期間 1753 年 1 月 1 日~ 9999 年 12 月 31 日
時間の範囲 00:00:00 から 23:59:59.997
タイム ゾーンのオフセット範囲 なし
要素範囲 YYYY は、年を表す 1753 から 9999 の 4 桁の数字です。

MM は、指定された年の 01 ~ 12 の月を表す 2 桁の数字です。

DD は、指定された月の (月に応じて) 01 ~ 31 の日を表す 2 桁の数字です。

hh は、00 ~ 23 の時を表す 2 桁の数字です。

mm は、分を表す 00 から 59 の 2 桁の数字です。

ss は、秒を表す 00 から 59 の 2 桁の数字です。

n* は、秒の有効桁数を表す 3 桁の数字です (0 から 999)。
文字長 19 文字以上、23 文字以下
ストレージ サイズ 8 バイト
精度 値は、.000、.003、または .007 秒単位に丸められます。
既定値 1900-01-01 00:00:00
Calendar グレゴリオ暦 (完全な年の範囲は含まれません。)
ユーザー定義の 1 秒未満の秒の有効桁数 いいえ
タイム ゾーン オフセットへの対応と保持 いいえ
夏時間への対応 いいえ

datetime でサポートされる文字列リテラル形式

次の表は、datetime でサポートされている文字列リテラル形式を一覧にしたものです。 ODBC を除き、datetime の文字列リテラルは単一引用符 (') で囲んで指定します (例: 'string_literaL')。 us_english 以外の環境では、文字列リテラルを N'string_literaL' 形式で指定する必要があります。

数値 説明
日付形式 :

[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)

時刻の形式:

14:30

14:30[:20:999]

14:30[:20.9]

4am

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

number separator number separator number [time] [time]



言語設定が us_english の場合、既定の日付順序は月、日、年 (mdy) です。 日付順序は、SET DATEFORMAT ステートメントを使用して変更できます。

SET DATEFORMAT の設定は、日付の値がどのように解釈されるかを決定します。 順序が設定と一致しない場合、値は日付として解釈されません。 日付が順序どおりでない場合、範囲外または不正な値に誤って解釈される可能性があります。 たとえば、12/10/08 は、DATEFORMAT の設定によっては、6 種類の日付形式のうちのいずれにも解釈できます。 4 桁の年は年と解釈されます。
アルファベット 説明
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]
月の正式名を使って日付データを指定できます。 たとえば、現在の言語で指定されている April やその省略形である Apr を使用できます。コンマは省略でき、大文字と小文字の違いは無視されます。

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

1) 日時データを単一引用符 (') で囲みます。 English 以外の言語では、N' を使用します。

2) 角かっこで囲まれた文字は省略可能です。

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

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



月をアルファベット形式で指定したときは、SET DATEFORMAT のセッション設定は適用されません。
ISO 8601 説明
YYYY-MM-DDThh:mm:ss[.mmm]

YYYYMMDD[ hh:mm:ss[.mmm]]
次に例を示します。

1) 2004-05-23T14:25:10

2) 2004-05-23T14:25:10.487



ISO 8601 形式を使用する場合、各要素はこの形式で指定する必要があります。これには、形式にある T、コロン (:)、およびピリオド (.) を含みます。

秒の構成要素を示す角かっこは省略できます。 時の構成要素は 24 時間形式で指定します。

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

ISO 8601 形式を使用する利点は、これが明確な仕様を持つ国際標準であるという点です。 また、この形式は、SET DATEFORMAT や SET LANGUAGE の設定の影響を受けません。
区切りなし 説明
YYYYMMDD hh:mm:ss[.mmm]
ODBC 説明
{ ts '1998-05-02 01:23:56.123' }

{ d '1990-10-02' }

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

ODBC タイムスタンプ エスケープ シーケンスは、{ literal_type 'constant_value' }: という形式です。



- literal_type はエスケープ シーケンスの種類を指定します。 タイムスタンプには次の 3 つの literal_type 指定子があります。
1) d = 日付のみ
2) t = 時刻のみ
3) ts = タイムスタンプ (時刻と日付)



- 'constant_value' はエスケープ シーケンスの値です。 constant_valueliteral_type ごとに次の形式に従う必要があります。
d : yyyy-mm-dd
t : hh:mm:ss[.fff]
ts : yyyy-mm-dd hh:mm:ss[.fff]

datetime における 1 秒未満の秒の有効桁数の丸め処理

以下の表に示すように、datetime 値は .000、.003、または .007 秒の単位になるように丸められます。

ユーザー指定の値 システム格納値
01/01/98 23:59:59.999 1998-01-02 00:00:00.000
01/01/98 23:59:59.995

01/01/98 23:59:59.996

01/01/98 23:59:59.997

01/01/98 23:59:59.998
1998-01-01 23:59:59.997
01/01/98 23:59:59.992

01/01/98 23:59:59.993

01/01/98 23:59:59.994
1998-01-01 23:59:59.993
01/01/98 23:59:59.990

01/01/98 23:59:59.991
1998-01-01 23:59:59.990

ANSI および ISO 8601 への準拠

datetime は ANSI または ISO 8601 に準拠していません。

日付と時刻のデータ型の変換

日付と時刻のデータ型に変換する場合、SQL Server で日付または時刻と認識できない値はすべて拒否されます。 CAST 関数および CONVERT 関数で日付と時刻のデータを使用する方法については、「CAST および CONVERT (Transact-SQL)」を参照してください。

他の日付型や時刻型を datetime データ型に変換する

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

date からの変換では、年、月、日がコピーされます。 時刻部分は 00:00:00.000 に設定されます。 次のコードは、date 値を datetime 値に変換した結果を示しています。

DECLARE @date date = '12-21-16';  
DECLARE @datetime datetime = @date;  
  
SELECT @datetime AS '@datetime', @date AS '@date';  
  
--Result  
--@datetime               @date  
------------------------- ----------  
--2016-12-21 00:00:00.000 2016-12-21  

Note

上記の例では、地域固有の日付形式 (MM-DD-YY) を使用しています。

DECLARE @date date = '12-21-16';

例を更新して、お客様の地域の形式に一致させることができます。

また、ISO 8601 準拠の日付形式 (YYYY-MM-DD) を使ってこの例を完了することもできます。 次に例を示します。

DECLARE @date date = '2016-12-21';  
DECLARE @datetime datetime = @date;  

SELECT @datetime AS '@datetime', @date AS '@date';  

time(n) からの変換では、時刻部分がコピーされ、日付部分は "1900-01-01" に設定されます。 time(n) 値の小数部の有効桁数が 3 桁を超える場合、値はその桁数に合わせて切り捨てられます。 次の例は、time(4) 値を datetime 値に変換した結果を示しています。

DECLARE @time time(4) = '12:10:05.1237';  
DECLARE @datetime datetime = @time;  
  
SELECT @datetime AS '@datetime', @time AS '@time';  
  
--Result  
--@datetime               @time  
------------------------- -------------  
--1900-01-01 12:10:05.123 12:10:05.1237  

smalldatetime からの変換では、時と分がコピーされます。 秒と秒の小数部は 0 に設定されます。 次のコードは、smalldatetime 値を datetime 値に変換した結果を示しています。

DECLARE @smalldatetime smalldatetime = '12-01-16 12:32';  
DECLARE @datetime datetime = @smalldatetime;  
  
SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime';  
  
--Result  
--@datetime               @smalldatetime  
------------------------- -----------------------  
--2016-12-01 12:32:00.000 2016-12-01 12:32:00  

datetimeoffset(n) からの変換では、日付と時刻の部分がコピーされます。 タイム ゾーンは切り捨てられます。 datetimeoffset(n) 値の小数部の有効桁数が 3 桁を超える場合、値は切り捨てられます。 次の例は、datetimeoffset(4) 値を datetime 値に変換した結果を示しています。

DECLARE @datetimeoffset datetimeoffset(4) = '1968-10-23 12:45:37.1234 +10:0';  
DECLARE @datetime 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.1237 +10:0   

datetime2(n) からの変換では、日付と時刻がコピーされます。 datetime2(n) 値の小数部の有効桁数が 3 桁を超える場合、値は切り捨てられます。 次の例は、datetime2(4) 値を datetime 値に変換した結果を示しています。

DECLARE @datetime2 datetime2(4) = '1968-10-23 12:45:37.1237';  
DECLARE @datetime 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  

次の例では、文字列をそれぞれの date および time データ型にキャストした結果を比較します。

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 2007-05-08 12:35:29. 1234567
datetimeoffset 2007-05-08 12:35:29.1234567 +12:15

関連項目

CAST および CONVERT (Transact-SQL)