次の方法で共有


datetime (Transact-SQL)

適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

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

新しい作業には datetime を使用しないでください。 代わりに、 timedatedatetime2、および datetimeoffset データ型を使用します。 これらの型は SQL Standard と一致し、移植性が高くなります。 timedatetime2datetimeoffset は秒の有効桁数が増えています。 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 (既定) の場合、252025として解釈され、501950として解釈されます。 こうしたあいまいさを排除するため、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