date (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

定义 SQL Server 中的日期。 SQL Server 2008 (10.0.x) 中引入了 date 数据类型。

date 说明

properties
语法 DATE
使用情况 DECLARE @MyDate DATE

CREATE TABLE Table1 (Column1 DATE)
默认的字符串文字格式

(用于下级客户端)
yyyy-MM-dd

有关详细信息,请参阅下级客户端的后向兼容性部分。
范围 0001-01-019999-12-31(对于 Informatica,则为 1582-10-159999-12-31

公元 1 年 1 月 1 日(公历纪元)到公元 9999 年 12 月 31 日(对于 Informatica,公元 1582 年 10 月 15 日到公元 9999 年 12 月 31 日)
各元素的范围 yyyy 是表示年份的四位数字,范围为从 00019999。 Informatica 将 yyyy 的范围限制为 15829999

MM 是表示指定年份中的月份的两位数字,范围为从 0112

dd 是表示指定月份几号的两位数字,介于 0131 之间(具体视月份而定)。
字符长度 10 位
精度、小数位数 10, 0
存储大小 固定 3 个字节
存储结构 1 个 3 字节整数存储日期
精确度 一天
默认值 1900-01-01

此值用于从 time 隐式转换到 datetime2 或 datetimeoffset 时追加的日期部分 。
日历 公历
用户定义的秒的小数部分精度
时区偏移量感知和保留
夏时制感知

date 支持的字符串文字格式

以下各表显示了适用于 date 数据类型的有效字符串文字格式。

Numeric 说明
mdy

[m]m/dd/[yy]yy

[m]m-dd-[yy]yy

[m]m.dd.[yy]yy

myd

mm/[yy]yy/dd

mm-[yy]yy/dd

[m]m.[yy]yy.dd

dmy

dd/[m]m/[yy]yy

dd-[m]m-[yy]yy

dd.[m]m.[yy]yy

dym

dd/[yy]yy/[m]m

dd-[yy]yy-[m]m

dd.[yy]yy.[m]m

ymd

[yy]yy/[m]m/dd

[yy]yy-[m]m-dd

[yy]yy-[m]m-dd
[m]mdd[yy]yy 在字符串中表示月、日和年,使用斜线 (/)、连字符 (-) 或句点 (.) 作为分隔符。

仅支持四位或两位数字表示的年份。 请尽可能使用以四位数字表示的年份。 若要从 00019999 之间指定一个整数来表示缩略形式的年份,以将两位数的年份解释为四位数的年份,请使用配置“两位数年份截止”服务器配置选项。

注意:对于 Informatica,yyyy 限制为 15829999

一个比截止年份的后两位数字小或者与其相等的两位数年份与该截止年份处于同一个世纪。 而一个比截止年份的后两位数字大的两位数年份所处的世纪为截止年份所处世纪的上一个世纪。 例如,如果“两位数年份截止”为默认值 2049,则两位数年份 49 被解释为 2049,而两位数年份 50 被解释为 1950

默认日期格式由当前语言设置决定。 可以通过使用 SET LANGUAGESET DATEFORMAT 语句更改日期格式。

date 不支持 ydm 格式。
字母 说明
mon [dd][,] yyyy

mon dd[,] [yy]

mon yyyy [dd]

[dd] mon[,] yyyy

dd mon[,][yy]yy

dd [yy]yy mon

[dd] yyyy mon

yyyy mon [dd]

yyyy [dd] mon
mon 表示采用当前语言的完整月份名称或月份缩写。 逗号是可选的,且忽略大小写。

为避免不确定性,请使用四位数年份。

如果没有指定日,则默认为当月第一天。
ISO 8601 说明
yyyy-MM-dd

yyyyMMdd
与 SQL 标准相同。 此格式是唯一定义为国际标准的格式。
未分隔的 说明
[yy]yyMMdd

yyyy[MMdd]
可用四位、六位或八位数字来指定 date 数据。 六位或八位字符串始终解释为 ymd。 月和日必须始终是两位数字。 四位字符串被解释为年。
ODBC 说明
{ d 'yyyy-MM-dd' } 特定于 ODBC API。
W3C XML 格式 说明
yyyy-MM-ddTZD 支持使用 XML/SOAP。

TZD 是时区设计器(Z+hh:mm-hh:mm):

- hh:mm 表示时区偏移量。 hh 是两位数,介于 014 范围之间,表示时区偏移小时数。
- mm 是两位数,范围为 059,表示时区偏移量中的额外分钟数。
- +(加)或 -(减)是时区偏移量中必须包含的符号。 这两个符号表示,为了得出本地时间,将用协调世界时 (UTC) 加上或减去时区偏移量。 时区偏移量的有效范围为 -14:00+14:00

对 ANSI 和 ISO 8601 的遵从性

date 符合公历的 ANSI SQL 标准定义:

备注 85 - Datetime 数据类型将允许存储日期范围从 0001–01–01 CE 到 9999–12–31 CE 之间的公历格式的日期。

用于下级客户端的默认字符串文本格式遵循 SQL 标准格式(定义为 yyyy-MM-dd)。 该格式与 ISO 8601 对 DATE 的定义相同。

注意

对于 Informatica,范围限制为 1582-10-15(公元 1582 年 10 月 15 日)到 9999-12-31(公元 9999 年 12 月 31 日)。

下级客户端的向后兼容性

某些下级客户端不支持 time、date、datetime2 和 datetimeoffset 数据类型。 下表显示了 SQL Server 上级实例与下级客户端之间的类型映射。

SQL Server 数据类型 传递给下级客户端的默认字符串文字格式 下级 ODBC 下级 OLEDB 下级 JDBC 下级 SQLCLIENT
time hh:mm:ss[.nnnnnnn] SQL_WVARCHARSQL_VARCHAR DBTYPE_WSTRDBTYPE_STR Java.sql.String StringSqString
date yyyy-MM-dd SQL_WVARCHARSQL_VARCHAR DBTYPE_WSTRDBTYPE_STR Java.sql.String StringSqString
datetime2 yyyy-MM-dd HH:mm:ss[.nnnnnnn] SQL_WVARCHARSQL_VARCHAR DBTYPE_WSTRDBTYPE_STR Java.sql.String StringSqString
datetimeoffset yyyy-MM-dd HH:mm:ss[.nnnnnnn] [+ or -]hh:mm SQL_WVARCHARSQL_VARCHAR DBTYPE_WSTRDBTYPE_STR Java.sql.String StringSqString

转换日期和时间数据

转换为日期和时间数据类型时,SQL Server 拒绝它无法识别为日期或时间的所有值。 有关对日期和时间数据使用 CASTCONVERT 函数的信息,请参阅 CAST 和 CONVERT (Transact-SQL)

将 date 转换为其他日期和时间类型

此部分介绍了将 date 数据类型转换为其他日期和时间数据类型时会发生什么。

转换为 time(n) 时,转换失败,并引发错误消息 206:

操作数类型冲突: date 与 time 不兼容。

如果转换为 datetime,会复制日期部分。 下面的代码显示将 date 值转换为 datetime 值的结果。

DECLARE @date DATE = '12-10-25';
DECLARE @datetime DATETIME = @date;

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

下面是结果集:

@date      @datetime
---------- -----------------------
2025-12-10 2025-12-10 00:00:00.000

如果转换为 smalldatetimedate 值在 smalldatetime 范围内,日期部分被复制,且时间部分设置为 00:00:00.000。 当 date 值超出 smalldatetime 值的范围时,引发错误消息 242,并且 smalldatetime 值设置为 NULL

将 date 数据类型转换为 smalldatetime 数据类型时导致值超出范围。

下面的代码显示将 date 值转换为 smalldatetime 值的结果。

DECLARE @date DATE = '1912-10-25';
DECLARE @smalldatetime SMALLDATETIME = @date;

SELECT @date AS '@date',
    @smalldatetime AS '@smalldatetime';

下面是结果集。

@date      @smalldatetime
---------- -------------------
1912-10-25 1912-10-25 00:00:00

转换为 datetimeoffset(n) 时,会复制日期,且时间设置为 00:00.0000000 +00:00。 下面的代码显示将 date 值转换为 datetimeoffset(3) 值的结果。

DECLARE @date DATE = '1912-10-25';
DECLARE @datetimeoffset DATETIMEOFFSET(3) = @date;

SELECT @date AS '@date',
    @datetimeoffset AS '@datetimeoffset';

下面是结果集:

@date      @datetimeoffset
---------- ------------------------------
1912-10-25 1912-10-25 00:00:00.000 +00:00

转换为 datetime2(n) 时,会复制日期部分,时间部分设置为 00:00.000000。 下面的代码显示将 date 值转换为 datetime2(3) 值的结果。

DECLARE @date DATE = '1912-10-25'
DECLARE @datetime2 DATETIME2(3) = @date;

SELECT @date AS '@date',
    @datetime2 AS '@datetime2(3)';

下面是结果集。

@date      @datetime2(3)
---------- -----------------------
1912-10-25 1912-10-25 00:00:00.000

将字符串文字转换为 date

如果字符串所有部分的格式都有效,可以将字符串文本转换为日期和时间类型。 否则,将引发运行时错误。 如果从日期和时间类型隐式或显式转换为字符串文本,但未指定样式,将采用当前会话的默认格式。 下表显示用于将字符串文字转换为 date 数据类型的规则。

输入字符串文字 date
ODBC DATE ODBC 字符串文字映射到 datetime 数据类型。 任何从 ODBC DATETIME 文本到 date 类型的赋值操作,都会导致在 datetime 与转换规则定义的类型之间进行隐式转换。
ODBC TIME 请参阅前面的 ODBC DATE 规则。
ODBC DATETIME 请参阅前面的 ODBC DATE 规则。
仅 DATE 无庸赘述
仅 TIME 提供默认值。
仅 TIMEZONE 提供默认值。
DATE + TIME 使用输入字符串的 DATE 部分。
DATE + TIMEZONE 不允许。
TIME + TIMEZONE 提供默认值。
DATE + TIME + TIMEZONE 将使用本地 DATETIME 的 DATE 部分。

示例

下例比较了将一个字符串分别转换为各种 date 和 time 数据类型时所产生的结果 。

SELECT
    CAST('2022-05-08 12:35:29.1234567 +12:15' AS TIME(7)) AS 'time',
    CAST('2022-05-08 12:35:29.1234567 +12:15' AS DATE) AS 'date',
    CAST('2022-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
    CAST('2022-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
    CAST('2022-05-08 12:35:29.1234567 +12:15' AS DATETIME2(7)) AS 'datetime2',
    CAST('2022-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET(7)) AS 'datetimeoffset';

下面是结果集。

数据类型 输出
time 12:35:29.1234567
date 2022-05-08
smalldatetime 2022-05-08 12:35:00
datetime 2022-05-08 12:35:29.123
datetime2 2022-05-08 12:35:29.1234567
datetimeoffset 2022-05-08 12:35:29.1234567 +12:15

另请参阅