date (Transact-SQL)
定义 SQL Server 中的日期。
适用范围:SQL Server(SQL Server 2008 至当前版本),Windows Azure SQL Database(初始版本至当前版本)。 |
date 说明
属性 |
值 |
---|---|
语法 |
date |
用法 |
DECLARE @MyDate date CREATE TABLE Table1 ( Column1 date ) |
默认的字符串文字格式 (用于下级客户端) |
YYYY-MM-DD 有关详细信息,请参阅后面的“下级客户端的向后兼容性”部分。 |
范围 |
0001-01-01 到 9999-12-31 公元元年 1 月 1 日 到公元 9999 年 12 月 31 日 |
各元素的范围 |
YYYY 是表示年份的四位数字,范围为从 0001 到 9999。 MM 是表示指定年份中的月份的两位数字,范围为从 01 到 12。 DD 是表示指定月份中的某一天的两位数字,范围为从 01 到 31(最高值取决于具体月份)。 |
字符长度 |
10 位 |
精度、小数位数 |
10, 0 |
存储大小 |
固定 3 个字节 |
存储结构 |
1、3 字节整数存储日期。 |
精确度 |
一天 |
默认值 |
1900-01-01 此值用作从 time 隐式转换到 datetime2 或 datetimeoffset 时追加的日期部分。 |
日历 |
公历 |
用户定义的秒的小数部分精度 |
否 |
时区偏移量感知和保留 |
否 |
夏时制感知 |
否 |
date 支持的字符串文字格式
以下各表显示了适用于 date 数据类型的有效字符串文字格式。
数字日期格式 |
说明 |
---|---|
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 之间的整数来表示用于将两位数年份解释为四位数年份的截止年份,请使用配置两位数年份截止服务器配置选项。 一个比截止年份的后两位数字小或者与其相等的两位数年份与该截止年份处于同一个世纪。 而一个比截止年份的后两位数字大的两位数年份所处的世纪为该截止年份所处世纪的上一个世纪。 例如,如果“两位数年份截止”为默认值 2049,则两位数年份 49 被解释为 2049 年,而两位数年份 50 被解释为 1950 年。 默认日期格式由当前语言设置决定。 可以通过使用 SET LANGUAGE 和 SET DATEFORMAT 语句更改日期格式。 date 不支持 ydm 格式。 |
字母 |
说明 |
---|---|
mon [dd][,] yyyy mon dd[,] [yy]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[mm][dd] |
可用四位、六位或八位数字来指定 date 数据。 六位或八位字符串始终被解释为 ymd。 月和日必须始终是两位数字。 四位字符串被解释为年。 |
ODBC |
说明 |
---|---|
{ d 'yyyy-mm-dd' } |
特定于 ODBC API。 |
W3C XML 格式 |
说明 |
---|---|
yyyy-mm-ddTZD |
专为用于 XML/SOAP 而支持的格式。 TZD 是时区指示符(Z 或 +hh:mm 或 -hh:mm):
|
对 ANSI 和 ISO 8601 的遵从性
date 符合公历的 ANSI SQL 标准定义:“NOTE 85 - Datetime data types will allow dates in the Gregorian format to be stored in the date range 0001–01–01 CE through 9999–12–31 CE”(备注 85 – 日期时间数据类型将允许存储日期范围从 0001–01–01 CE 到 9999–12–31 CE 之间的公历格式的日期)。
默认字符串文字格式(用于下级客户端)将遵照 SQL 标准格式(定义为 YYYY-MM-DD)。 该格式与 ISO 8601 对 DATE 的定义相同。
下级客户端的向后兼容性
某些下级客户端不支持 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] [+|-]hh:mm |
SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTR 或 DBTYPE_STR |
Java.sql.String |
String 或 SqString |
转换日期和时间数据
当转换为日期和时间数据类型时,SQL Server 将会拒绝它无法识别为日期或时间的所有值。 有关对日期和时间数据使用 CAST 和 CONVERT 函数的信息,请参阅 CAST 和 CONVERT (Transact-SQL)。
要转换成的数据类型 |
转换详细信息 |
---|---|
time(n) |
转换失败,并引发错误消息 206:“操作数类型冲突: date 与 time 不兼容”。 |
datetime |
复制日期,时间部分设置为 00:00:00.000。 下面的代码显示将 date 值转换为 datetime 值的结果。
|
smalldatetime |
当 date 值在 smalldatetime 的范围内时,会复制日期部分,并将时间部分设置为 00:00:00。 当 date 值在 smalldatetime 值的范围以外时,会引发错误消息 242:“从 date 数据类型到 smalldatetime 数据类型的转换生成超出范围的值;smalldatetime 值设置为 NULL”。 下面的代码显示将 date 值转换为 smalldatetime 值的结果。
|
datetimeoffset(n) |
复制日期,时间设置为 00:00.0000000 +00:00。 下面的代码显示将 date 值转换为 datetimeoffset(3) 值的结果。
|
datetime2(n) |
复制日期部分,时间部分设置为 00:00:00.00,而不考虑 (n) 的值。 下面的代码显示将 date 值转换为 datetime2(3) 值的结果。
|
将 date 转换为其他日期和时间类型
下表介绍当 date 数据类型转换为其他日期和时间数据类型时发生的情况。
要转换成的数据类型 |
转换详细信息 |
---|---|
time(n) |
转换失败,并引发错误消息 206:“操作数类型冲突: date 与 time 不兼容”。 |
datetime |
复制日期。 下面的代码显示将 date 值转换为 datetime 值的结果。
|
smalldatetime |
当 date 值在 smalldatetime 的范围内时,会复制日期部分,并将时间部分设置为 00:00:00.000。 当 date 值不在 smalldatetime 值的范围内时,会引发错误消息 242:“从 date 数据类型到 smalldatetime 数据类型的转换生成超出范围的值。”,smalldatetime 值将设置为 NULL。 下面的代码显示将 date 值转换为 smalldatetime 值的结果。
|
datetimeoffset(n) |
复制日期,时间设置为 00:00.0000000 +00:00。 下面的代码显示将 date 值转换为 datetimeoffset(3) 值的结果。
|
datetime2(n) |
复制日期部分,时间部分设置为 00:00.000000。 下面的代码显示将 date 值转换为 datetime2(3) 值的结果。
|
将字符串文字转换为 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 部分。 |
示例
下例比较了将一个字符串分别转换为各种日期和时间数据类型时所产生的结果。
SELECT
CAST('2007-05-08 12:35:29. 1234567 +12:15' AS time(7)) AS 'time'
,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS date) AS 'date'
,CAST('2007-05-08 12:35:29.123' AS smalldatetime) AS
'smalldatetime'
,CAST('2007-05-08 12:35:29.123' AS datetime) AS 'datetime'
,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS datetime2(7)) AS
'datetime2'
,CAST('2007-05-08 12:35:29.1234567 +12:15' AS datetimeoffset(7)) AS
'datetimeoffset';
下面是结果集:
数据类型 |
输出 |
---|---|
time |
12:35:29. 1234567 |
date |
2007-05-08 |
smalldatetime |
2007-05-08 12:35:00 |
datetime |
2007-05-08 12:35:29.123 |
datetime2 |
2007-05-08 12:35:29. 1234567 |
datetimeoffset |
2007-05-08 12:35:29.1234567 +12:15 |