datetime (Transact-SQL)
適用対象: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
24 時間形式の時刻 (1 秒未満の秒を含む) と組み合わせた日付を定義します。
新しい作業には datetime を使用しないでください。 代わりに、 time、 date、 datetime2、および datetimeoffset データ型を使用します。 これらの型は SQL Standard と一致し、移植性が高くなります。 time、datetime2、datetimeoffset は秒の有効桁数が増えています。 datetimeoffset グローバルに配置されるアプリケーション向けにタイム ゾーンのサポートを提供します。
説明
プロパティ | 値 |
---|---|
構文 | DATETIME |
使用方法 | DECLARE @MyDatetime DATETIME; CREATE TABLE Table1 (Column1 DATETIME); |
既定の文字列リテラル形式 (下位レベルのクライアントに使用) | 適用なし |
日付範囲 | 1753-01-01 (1753 年 1 月 1 日) ~ 9999-12-31 (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 は、2 番目を表す 2 桁の 00 から 59 までの範囲の 2 桁です。n* は、秒の小数部を表す、 0 から 999 までの 0 から 3 桁の数字です。 |
文字の長さ | 19 文字以上、23 文字以下 |
ストレージ サイズ | 8 バイト |
精度 | .000 、.003 、または.007 秒の増分に丸められます |
既定値 | 1900-01-01 00:00:00 |
Calendar | グレゴリオ暦 (年の完全な範囲を含む) |
ユーザー定義の秒の小数部の有効桁数 | いいえ |
タイム ゾーン オフセットの認識と保持 | いいえ |
夏時間に対応 | いいえ |
datetime でサポートされる文字列リテラル形式
次の表は、datetime でサポートされている文字列リテラル形式を一覧にしたものです。 ODBC を除き、 datetime 文字列リテラルは単一引用符 ('
) で囲 'string_literaL'
。 環境が us_english
されていない場合、文字列リテラルは Unicode 形式の N'string_literaL'
にする必要があります。
数値形式
月名を数値で表して日付データを指定できます。 たとえば、 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 桁の年は年と解釈されます。
日付の形式 | 注文 |
---|---|
[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:997] |
14:30[:20.9] |
4am |
4 PM |
アルファベット順の形式
月の正式名を使って日付データを指定できます。 たとえば、 April
、現在の言語で指定されている Apr
の月の省略形などです。 コンマは省略可能であり、大文字と小文字は無視されます。
アルファベット日付形式の使用に関するガイドラインを次に示します。
日付と時刻のデータを単一引用符 (
'
) で囲みます。 英語以外の言語の場合は、N''
を使用します。角かっこで囲まれた文字は省略可能です。
年の最後の 2 桁のみを指定した場合、 2 桁の年のカットオフの値の最後の 2 桁未満の値 構成オプションは、カットオフ年と同じ世紀になります。 値がこの構成オプションより大きいか、同じである場合、指定した西暦は基準になる年の世紀より前の世紀になります。 たとえば、2 桁の年のカットオフが
2050
(既定) の場合、25
は2025
として解釈され、50
は1950
として解釈されます。 こうしたあいまいさを排除するため、4 桁の西暦を使用してください。日を省略したときは、その月の 1 日が指定されます。
SET DATEFORMAT
セッション設定は、月をアルファベット順に指定した場合には適用されません。
アルファベット順 |
---|
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] |
ISO 8601 形式です。
ISO 8601 形式を使用するには、 T
、コロン (:
)、および形式で表示されるピリオド (.
) など、各要素を形式で指定する必要があります。
秒の構成要素を示す角かっこは省略できます。 時の構成要素は 24 時間形式で指定します。 T
は、datetime 値の時刻部分の開始を示します。
ISO 8601 形式を使用する利点は、明確な仕様を持つ国際標準である点です。 また、この形式は、 SET DATEFORMAT
または SET LANGUAGE 設定の影響を受けません。
例 :
2004-05-23T14:25:10
2004-05-23T14:25:10.487
ISO 8601 |
---|
yyyy-MM-ddTHH:mm:ss[.mmm] |
yyyyMMdd[ HH:mm:ss[.mmm]] |
未設定の形式
この形式は ISO 8601 形式に似ていますが、日付区切り記号が含まれている点が異なります。
区切りなし |
---|
yyyyMMdd HH:mm:ss[.mmm] |
ODBC 形式
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>
指定子があります。d
= 日付のみt
= 時間のみts
= タイムスタンプ (時刻 + 日付)
<constant_value>
はエスケープ シーケンスの値です。<constant_value>
は、各<literal_type>
の次の形式に従う必要があります。d
:yyyy-MM-dd
t
:hh:mm:ss[.fff]
ts
:yyyy-MM-dd HH:mm:ss[.fff]
ODBC |
---|
{ ts '1998-05-02 01:23:56.123' } |
{ d '1990-10-02' } |
{ t '13:33:41' } |
datetime における 1 秒未満の秒の有効桁数の丸め処理
datetime 値は、次の例に示すように、 .000
、 .003
、または .007
秒の増分に丸められます。
SELECT '01/01/2024 23:59:59.999' AS [User-specified value],
CAST('01/01/2024 23:59:59.999' AS DATETIME) AS [System stored value]
UNION SELECT '01/01/2024 23:59:59.998', CAST('01/01/2024 23:59:59.998' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.997', CAST('01/01/2024 23:59:59.997' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.996', CAST('01/01/2024 23:59:59.996' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.995', CAST('01/01/2024 23:59:59.995' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.994', CAST('01/01/2024 23:59:59.994' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.993', CAST('01/01/2024 23:59:59.993' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.992', CAST('01/01/2024 23:59:59.992' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.991', CAST('01/01/2024 23:59:59.991' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.990', CAST('01/01/2024 23:59:59.990' AS DATETIME);
結果セットは次のようになります。
ユーザー指定の値 | システム格納値 |
---|---|
01/01/2024 23:59:59.999 |
2024-01-02 00:00:00.000 |
01/01/2024 23:59:59.998 01/01/2024 23:59:59.997 01/01/2024 23:59:59.996 01/01/2024 23:59:59.995 |
2024-01-01 23:59:59.997 |
01/01/2024 23:59:59.994 01/01/2024 23:59:59.993 01/01/2024 23:59:59.992 |
2024-01-01 23:59:59.993 |
01/01/2024 23:59:59.991 01/01/2024 23:59:59.990 |
2024-01-01 23:59:59.990 |
ANSI および ISO 8601 への準拠
datetime は ANSI または ISO 8601 に準拠していません。
日付と時刻のデータを変換する
日付と時刻のデータ型に変換すると、データベース エンジンは日付または時刻として認識できないすべての値を拒否します。 日付と時刻のデータで CAST
関数と CONVERT
関数を使用する方法については、 CAST と CONVERTを参照してください。
他の日付と時刻の型を 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';
結果セットは次のようになります。
@datetime @date
------------------------ -----------
2016-12-21 00:00:00.000 2016-12-21
前の例では、リージョン固有の日付形式 (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';
結果セットは次のようになります。
@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';
結果セットは次のようになります。
@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';
結果セットは次のようになります。
@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';
結果セットは次のようになります。
@datetime @datetime2
------------------------ -------------------------
1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237
例
次の例では、文字列をそれぞれの date および time データ型にキャストした結果を比較します。
SELECT CAST('2024-05-08 12:35:29.1234567 +12:15' AS TIME(7)) AS 'time',
CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATE) AS 'date',
CAST('2024-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
CAST('2024-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATETIME2(7)) AS 'datetime2',
CAST('2024-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET(7)) AS 'datetimeoffset';
結果セットは次のようになります。
データ型 | 出力 |
---|---|
time |
12:35:29.1234567 |
date |
2024-05-08 |
smalldatetime |
2024-05-08 12:35:00 |
datetime |
2024-05-08 12:35:29.123 |
datetime2 |
2024-05-08 12:35:29.1234567 |
datetimeoffset |
2024-05-08 12:35:29.1234567 +12:15 |