date (Transact-SQL)
适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (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-01 到 9999-12-31 (对于 Informatica,则为 1582-10-15 到 9999-12-31 )公元 1 年 1 月 1 日(公历纪元)到公元 9999 年 12 月 31 日(对于 Informatica,公元 1582 年 10 月 15 日到公元 9999 年 12 月 31 日) |
各元素的范围 | yyyy 是表示年份的四位数字,范围为从 0001 到 9999 。 Informatica 将 yyyy 的范围限制为 1582 到 9999 。MM 是表示指定年份中的月份的两位数字,范围为从 01 到 12 。dd 是表示指定月份几号的两位数字,介于 01 和 31 之间(具体视月份而定)。 |
字符长度 | 10 位 |
精度、小数位数 | 10, 0 |
存储大小 | 固定 3 个字节 |
存储结构 | 1 个 3 字节整数存储日期 |
精确度 | 一天 |
默认值 | 1900-01-01 此值用于从 time 隐式转换到 datetime2 或 datetimeoffset 时追加的日期部分 。 |
日历 | 公历 |
用户定义的秒的小数部分精度 | 否 |
时区偏移量感知和保留 | 否 |
夏时制感知 | 否 |
date 支持的字符串文字格式
以下列表显示了日期数据类型的有效字符串文本格式。
[m]m
、dd
和 [yy]yy
在字符串中表示月、日和年,使用斜线 (/
)、连字符 (-
) 或句点 (.
) 作为分隔符。
仅支持四位或两位数字表示的年份。 请尽可能使用以四位数字表示的年份。 若要指定一个整数 0001
, 9999
表示将两位数年份解释为四位数年份的截止年份,请使用 两位数年份截止 服务器配置选项。
对于 Informatica,yyyy
限制为范围1582
9999
。
一个比截止年份的后两位数字小或者与其相等的两位数年份与该截止年份处于同一个世纪。 而一个比截止年份的后两位数字大的两位数年份所处的世纪为截止年份所处世纪的上一个世纪。 例如,如果“两位数年份截止”为默认值 2049
,则两位数年份 49
被解释为 2049
,而两位数年份 50
被解释为 1950
。
默认日期格式由当前语言设置决定。 可以通过使用 SET LANGUAGE 和 SET DATEFORMAT 语句更改日期格式。
date 不支持 ydm
格式。
月-日-年字符串文本格式
SET DATEFORMAT mdy;
[m]m/dd/[yy]yy
[m]m-dd-[yy]yy
一年一月的字符串文本格式
SET DATEFORMAT myd;
[m]m/[yy]yy/dd
[m]m-[yy]yy-dd
[m]m.[yy]yy.dd
日月-年字符串文本格式
SET DATEFORMAT dmy;
dd/[m]m/[yy]yy
dd-[m]m-[yy]yy
dd.[m]m.[yy]yy
日-年-月的字符串文本格式
SET DATEFORMAT dym;
dd/[yy]yy/[m]m
dd-[yy]yy-[m]m
dd.[yy]yy.[m]m
year-month-day 的字符串文本格式
SET DATEFORMAT ymd;
[yy]yy/[m]m/dd
[yy]yy-[m]m-dd
[yy]yy-[m]m-dd
格式的字母列表
[dd] mon[,] yyyy
dd mon[,][yy]yy
dd [yy]yy mon
[dd] yyyy mon
mon [dd][,] yyyy
mon dd[,] [yy]
mon yyyy [dd]
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
是两位数,介于0
和14
范围之间,表示时区偏移小时数。mm
是两位数,范围为0
到59
,表示时区偏移量中的额外分钟数。+
(加)或-
(减)是时区偏移量中必须包含的符号。 这两个符号表示,为了得出本地时间,将用协调世界时 (UTC) 加上或减去时区偏移量。 时区偏移量的有效范围为-14:00
到+14:00
。
对 ANSI 和 ISO 8601 的遵从性
date 符合公历的 ANSI SQL 标准定义:
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_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTR 或 DBTYPE_STR |
Java.sql.String |
String 或 SqString |
date | yyyy-MM-dd |
SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTR 或 DBTYPE_STR |
Java.sql.String |
String 或 SqString |
datetime2 | yyyy-MM-dd HH:mm:ss[.nnnnnnn] |
SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTR 或 DBTYPE_STR |
Java.sql.String |
String 或 SqString |
datetimeoffset | yyyy-MM-dd HH:mm:ss[.nnnnnnn] [+ or -]hh:mm |
SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTR 或 DBTYPE_STR |
Java.sql.String |
String 或 SqString |
转换日期和时间数据
转换为日期和时间数据类型时,SQL Server 拒绝它无法识别为日期或时间的所有值。 有关对日期和时间数据使用 CAST
和 CONVERT
函数的信息,请参阅 CAST 和 CONVERT。
将 date 转换为其他日期和时间类型
此部分介绍了将 date 数据类型转换为其他日期和时间数据类型时会发生什么。
转换为 time(n) 时,转换失败,并引发错误消息 206:
操作数类型冲突: date 与 time 不兼容。
如果转换为 datetime,会复制日期部分。 下面的代码显示将 date 值转换为 datetime 值的结果。
DECLARE @date AS DATE = '12-10-25';
DECLARE @datetime AS DATETIME = @date;
SELECT @date AS '@date',
@datetime AS '@datetime';
结果集如下。
@date @datetime
---------- -----------------------
2025-12-10 2025-12-10 00:00:00.000
如果转换为 smalldatetime,date 值在 smalldatetime 范围内,日期部分被复制,且时间部分设置为 00:00:00.000
。 当 date 值超出 smalldatetime 值的范围时,引发错误消息 242,并且 smalldatetime 值设置为 NULL
:
将 date 数据类型转换为 smalldatetime 数据类型时导致值超出范围。
下面的代码显示将 date 值转换为 smalldatetime 值的结果。
DECLARE @date AS DATE = '1912-10-25';
DECLARE @smalldatetime AS 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 AS DATE = '1912-10-25';
DECLARE @datetimeoffset AS 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 AS DATE = '1912-10-25';
DECLARE @datetime2 AS 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';
结果集如下。
Data type | 输出 |
---|---|
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 |