datetime (Transact-SQL)

用于定义一个与采用 24 小时制并带有秒小数部分的一日内时间相组合的日期。

注意注意

对于新的工作,请使用 time、date、datetime2 和 datetimeoffset 数据类型。这些类型符合 SQL 标准。它们更易于移植。time、datetime2 和 datetimeoffset 提供更高精度的秒数。datetimeoffset 为全局部署的应用程序提供时区支持。

有关所有 Transact-SQL 日期和时间数据类型及函数的概述,请参阅日期和时间函数 (Transact-SQL)。有关日期和时间数据类型及函数共有的信息和示例,请参阅使用日期和时间数据

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 日。当使用数值日期格式时,请在使用正斜杠符号 (/)、连字符 (-) 或句点 (.) 作为分隔符的字符串中指定年、月、日。此字符串必须采用以下格式:

  • 数字 分隔符 数字 分隔符 number [time] [time]

当语言设置为 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 指定;逗号是可选的,且忽略大小写。

下面是使用字母日期格式的一些准则:

  • 日期和时间数据要放在单引号 (') 内。对于英语以外的其他语言,使用 N'。

  • 方括号中的字符是可选的。

  • 如果只指定年份的最后两位数字,则小于两位数年份截止配置选项值最后两位数字的值与截止年份处于同一个世纪。大于或等于该选项值的值处于截止年份的上一个世纪。例如,如果两位数年份截止为 2050(默认值),则两位数年份 25 被解释为 2025 年,而 50 被解释为 1950 年。为避免不确定性,请使用四位数年份。

  • 如果没有指定日,则默认值为当月第一天。

当按字母形式指定月份时,SET DATEFORMAT 会话设置不起作用。

ISO 8601

说明

YYYY-MM-DDThh:mm:ss[.mmm]

YYYYMMDD[ hh:mm:ss[.mmm]]

示例:

  • 2004-05-23T14:25:10

  • 2004-05-23T14:25:10.487

若要使用 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' }:

  • literal_type 指定转义序列的类型。时间戳有三个 literal_type 说明符:

    • d = 仅日期

    • t = 仅时间

    • ts = 时间戳(时间 + 日期)

  • 'constant_value' 是转义序列的值。constant_value 必须遵循下面每个 literal_type 的格式。

    literal_typeconstant_value 格式
    dyyyy-mm-dd
    thh:mm:ss[.fff]
    tsyyyy-mm-dd hh:mm:ss[.fff]

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。

示例

下例比较了将一个字符串分别转换为各种 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