datetime (Transact-SQL)
用于定义一个与采用 24 小时制并带有秒小数部分的一日内时间相组合的日期。
注意 |
---|
对于新的工作,请使用 time、date、datetime2 和 datetimeoffset 数据类型。 这些类型符合 SQL 标准。 它们更易于移植。 time、datetime2 和 datetimeoffset 提供更高精度的秒数。 datetimeoffset 为全局部署的应用程序提供时区支持。 |
datetime 说明
属性 |
值 |
---|---|
语法 |
datetime |
用法 |
DECLARE @MyDatetime datetime CREATE TABLE Table1 ( Column1 datetime ) |
默认的字符串文字格式 (用于下级客户端) |
不适用 |
日期范围 |
1753 年 1 月 1 日到 9999 年 12 月 31 日 |
时间范围 |
00:00:00 到 23:59:59.997 |
时区偏移量范围 |
无 |
各元素的范围 |
YYYY 是表示年份的四位数字,范围为 1753 到 9999。 MM 是表示指定年份中的月份的两位数字,范围为 01 到 12。 DD 是表示指定月份中的某一天的两位数字,范围为 01 到 31(最高值取决于相应月份)。 hh 是表示小时的两位数字,范围为 00 到 23。 mm 是表示分钟的两位数字,范围为 00 到 59。 ss 是表示秒钟的两位数字,范围为 00 到 59。 n* 为一个 0 到 3 位的数字,范围为 0 到 999,表示秒的小数部分。 |
字符长度 |
最低 19 位到最高 23 位 |
存储大小 |
8 字节 |
精确度 |
舍入到 .000、.003 或 .007 秒三个增量。 |
默认值 |
1900-01-01 00:00:00 |
日历 |
公历(不包括完整的年份范围。) |
用户定义的秒的小数部分精度 |
否 |
时区偏移量感知和保留 |
否 |
夏时制感知 |
否 |
datetime 支持的字符串文字格式
以下各表列出了 datetime 支持的字符串文字格式。 datetime 字符串文字位于单引号 (') 中,例如 'string_literaL',但 ODBC 除外。 如果环境不是 us_english,则字符串文字应采用 N'string_literaL' 格式。
数值 |
说明 |
---|---|
日期格式: [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:999] 14:30[:20.9] 4am 4 PM |
您可以指定日期数据,其中月份也通过数值指定。 例如 5/20/97 表示 1997 年 5 月 20 日。 当使用数值日期格式时,请在使用正斜杠符号 (/)、连字符 (-) 或句点 (.) 作为分隔符的字符串中指定年、月、日。 此字符串必须采用以下格式:
当语言设置为 us_english 时,默认的日期顺序是 mdy。 可以使用 SET DATEFORMAT 语句更改日期顺序。 SET DATEFORMAT 的设置决定了如何解释日期值。 如果顺序和设置不匹配,这些值将由于超出范围而不会被解释成日期,或者被错误地解释。 例如,12/10/08 可以解释成六个不同的日期,具体解释为哪一日期取决于 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] |
您可以指定一个日期数据,其中使用完整的月份名称来指定月份。 例如,月份用英语 April 或使用其缩写 Apr 指定;逗号是可选的,且忽略大小写。 下面是使用字母日期格式的一些准则:
当按字母形式指定月份时,SET DATEFORMAT 会话设置不起作用。 |
ISO 8601 |
说明 |
---|---|
YYYY-MM-DDThh:mm:ss[.mmm] YYYYMMDD[ hh:mm:ss[.mmm]] |
示例:
若要使用 ISO 8601 格式,必须按此格式指定每一个元素。 这也包括显示在此格式中的 T、冒号 (:) 和句点 (.)。 方括号表示秒小数部分是可选的。 时间部分按 24 小时制指定。 T 表示其后是 datetime 值的时间部分。 使用 ISO 8601 格式的优点是它是一种国际标准,不会产生模糊的指定。 同时,此格式不受 SET DATEFORMAT 或 SET LANGUAGE 设置的影响。 |
未分隔的 |
说明 |
---|---|
YYYYMMDD hh:mm:ss[.mmm] |
ODBC |
说明 |
||||||||
---|---|---|---|---|---|---|---|---|---|
{ ts '1998-05-02 01:23:56.123' } { d '1990-10-02' } { t '13:33:41' } |
ODBC API 用于定义转义序列以表示日期和时间值,ODBC 称之为时间戳数据。 Microsoft OLE DB Provider for SQL Server 所支持的 OLE DB 语言定义 (DBGUID-SQL) 也支持这种 ODBC 时间戳格式。 使用 ADO、OLE DB 和基于 ODBC 的 API 的应用程序可以使用这种 ODBC 时间戳格式来表示日期和时间。 ODBC 时间戳的转义序列格式为:{ literal_type 'constant_value' }:
|
datetime 秒的小数部分精度的舍入
如下表所示,将 datetime 值舍入到 .000、.003、或 .007 秒的增量。
用户指定的值 |
系统存储的值 |
---|---|
01/01/98 23:59:59.999 |
1998-01-02 00:00:00.000 |
01/01/98 23:59:59.995 01/01/98 23:59:59.996 01/01/98 23:59:59.997 01/01/98 23:59:59.998 |
1998-01-01 23:59:59.997 |
01/01/98 23:59:59.992 01/01/98 23:59:59.993 01/01/98 23:59:59.994 |
1998-01-01 23:59:59.993 |
01/01/98 23:59:59.990 01/01/98 23:59:59.991 |
1998-01-01 23:59:59.990 |
对 ANSI 和 ISO 8601 的遵从性
datetime 不遵从 ANSI 或 ISO 8601。
转换日期和时间数据
当转换为日期和时间数据类型时,SQL Server 将会拒绝它无法识别为日期或时间的所有值。 有关对日期和时间数据使用 CAST 和 CONVERT 函数的信息,请参阅 CAST 和 CONVERT (Transact-SQL)。
将 datetime 转换为其他日期和时间类型
下表介绍当 datetime 数据类型转换为其他日期和时间数据类型时发生的情况。
要转换成的数据类型 |
转换详细信息 |
---|---|
date |
复制年、月、日。 时间部分设置为 00:00:00.000。 下面的代码显示将 date 值转换为 datetime 值的结果。
|
time(n) |
复制时间部分,日期部分设置为“1900-01-01”。 当 time(n) 值的小数部分精度大于三位时,该值将被截断,以适合目标精度。 下面的示例显示将 time(4) 值转换为 datetime 值的结果。
|
smalldatetime |
复制小时和分钟。 秒和秒的小数部分设置为 0。 下面的代码显示将 smalldatetime 值转换为 datetime 值的结果。
|
datetimeoffset(n) |
复制日期和时间部分。 时区被截断。 当 datetimeoffset(n) 值的小数部分精度大于三位时,该值将被截断。 下面的示例显示将 datetimeoffset(4) 值转换为 datetime 值的结果。
|
datetime2(n) |
复制日期和时间。 当 datetime2(n) 值的小数部分精度大于三位时,该值将被截断。 下面的示例显示将 datetime2(4) 值转换为 datetime 值的结果。
|
示例
下例比较了将一个字符串分别转换为各种 date 和 time 数据类型所产生的结果。
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 |