添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 中的 SQL 分析终结点 Microsoft Fabric 中的仓库

定义 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 支持的字符串文字格式

以下各表显示了适用于 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

如果转换为 smalldatetimedate 值在 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

提交和查看相关反馈