次の方法で共有


datetime (Transact-SQL)

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

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

新しい作業には datetime を使用しないでください。 代わりに、時刻、日付、datetime2、および 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は 1 年を表す 4 桁の数字17539999です。

MMは、指定した年の月を0112表す 2 桁の数字です。

ddは、指定した月の日を0131表す月に応じて、2 桁の数字です。

HHは、時間を0023表す 2 桁の数字です。

mmは、分を0059表す 2 桁の数字です。

ssは、2 番目を0059表す 2 桁の数字です。

n*は、秒の小数部を0999表す 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 時間形式で指定します。 datetime T 値の時刻部分の開始を示します。

ISO 8601 形式を使用する利点は、明確な仕様を持つ国際標準である点です。 また、この形式は、または SET LANGUAGE 設定の影響をSET DATEFORMAT受けません。

例 :

  • 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 に準拠していません。

日付と時刻のデータを変換する

日付と時刻のデータ型に変換すると、データベース エンジンは日付または時刻として認識できないすべての値を拒否します。 日付と時刻のデータで関数をCASTCONVERT使用する方法については、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