定义 SQL Server 中的日期。 SQL Server 2008 (10.0.x) 中引入了
date
数据类型。
date 说明
properties
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, 0
固定 3 个字节
1 个 3 字节整数存储
日期
1900-01-01
此值用于从 time 隐式转换到 datetime2 或 datetimeoffset 时追加的日期部分 。
用户定义的秒的小数部分精度
时区偏移量感知和保留
夏时制感知
以下各表显示了适用于 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]m
、
dd
和
[yy]yy
在字符串中表示月、日和年,使用斜线 (
/
)、连字符 (
-
) 或句点 (
.
) 作为分隔符。
仅支持四位或两位数字表示的年份。 请尽可能使用以四位数字表示的年份。 若要从
0001
到
9999
之间指定一个整数来表示缩略形式的年份,以将两位数的年份解释为四位数的年份,请使用配置“两位数年份截止”
服务器配置选项。
注意:
对于 Informatica,
yyyy
限制为
1582
到
9999
。
一个比截止年份的后两位数字小或者与其相等的两位数年份与该截止年份处于同一个世纪。 而一个比截止年份的后两位数字大的两位数年份所处的世纪为截止年份所处世纪的上一个世纪。 例如,如果“两位数年份截止”为默认值
2049
,则两位数年份
49
被解释为
2049
,而两位数年份
50
被解释为
1950
。
默认日期格式由当前语言设置决定。 可以通过使用
SET LANGUAGE
和
SET 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
表示采用当前语言的完整月份名称或月份缩写。 逗号是可选的,且忽略大小写。
为避免不确定性,请使用四位数年份。
如果没有指定日,则默认为当月第一天。
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
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 (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
如果转换为 smalldatetime,date 值在 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 数据类型的规则。
输入字符串文字
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';
下面是结果集。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:https://aka.ms/ContentUserFeedback。
提交和查看相关反馈