语言

日期和时间数据

SQL Server 2008 引入了独立的日期和时间数据类型,并扩展了具有更大范围、更高精度和时区感知能力的数据类型。 使用 Microsoft.Data.SqlClient NuGet 包,从客户端应用程序访问这些数据类型。 有关本文中的示例,请在 C# 或 Visual Basic 中导入 Microsoft.Data.SqlClient 和 System.Data。 常见的 SQL 值类型仍位于 System.Data.SqlTypes 中。

SQL Server 2008 之前的 SQL Server 版本仅具有两种用于处理日期和时间值的数据类型:datetime 和 smalldatetime。 这两种数据类型都同时包含日期值和时间值,难以仅使用日期值或仅使用时间值。 此外,这些数据类型只支持在 1753 年英国引入公历之后的日期。 另一个限制是,这些旧数据类型无法感知时区,这使得处理来自多个时区的数据变得困难。

有关 SQL Server 中的日期和时间类型的详细信息,请参阅日期和时间数据类型和函数。

SQL Server 2008 中引入的日期/时间数据类型

下表介绍了新日期和时间数据类型。

SQL Server 数据类型 说明
date date 数据类型的范围从 01 年 1 月 1 日 9999 年 12 月 31 日,精确到 1 天。 默认值为 January 1, 1900。 存储大小为 3 个字节。
time time 数据类型仅采用 24 小时制存储时间值。 time 数据类型介于 00:00:00.0000000 到 23:59:59.9999999 范围之间,准确度为 100 纳秒。 默认值为 00:00:00.0000000(午夜)。 time 数据类型支持用户定义的小数秒精度,存储大小根据指定的精度在 3 字节到 6 字节之间变化。
datetime2 datetime2 数据类型将 date 和 time 数据类型的范围和精度合并为一个数据类型。

默认值和字符串文本格式与 date 和 time 数据类型中定义的相同。
datetimeoffset datetimeoffset 数据类型具有 datetime2 的所有功能,并添加了时区偏移量。 时区偏移量表示为 [+|-] HH:MM。 HH 是两位数,介于 00 和 14 范围之间,表示时区偏移量中的小时数。 MM 是两位数,范围为 00 到 59,表示时区偏移量中的额外分钟数。 时间格式支持到 100 毫微秒。 必需符号 + 或 - 指明是在 UTC(协调世界时或格林威治标准时间)中加上还是减去时区偏移来获得本地时间。

备注

要详细了解如何使用 Type System Version,请参阅 ConnectionString。

日期格式和日期顺序

SQL Server 如何分析日期和时间值不仅取决于类型系统版本和服务器版本,还取决于服务器的默认语言和格式设置。 如果一个日期字符串适用于某种语言的日期格式,而查询是通过设置了其他语言和日期格式的连接来执行的,那么该日期字符串可能无法识别。

Transact-SQL SET LANGUAGE 语句会隐式设置 DATEFORMAT,该设置决定日期部分的顺序。 可以在连接上使用 SET DATEFORMAT Transact-SQL 语句,通过将日期部分按 MDY、DMY、YMD、YDM、MYD 或 DYM 顺序排列来消除日期值的歧义。

如果未为该连接指定任何 DATEFORMAT 项,SQL Server 将使用与该连接关联的默认语言。 例如,在语言设置为美国英语的服务器上,日期字符串“01/02/03”会被解释为 MDY(2003 年 1 月 2 日);而在语言设置为英国英语的服务器上,则会被解释为 DMY(2003 年 2 月 1 日)。 年份是由 SQL Server 的临界年份规则确定的,此规则定义了用于指定世纪值的临界日期。 有关详细信息,请参阅两位数年份界限选项。

备注

从字符串格式转换为 date、time、datetime2 或 datetimeoffset 时,不支持 YDM 日期格式。

有关 SQL Server 如何解释日期和时间数据的更多信息,请参见使用日期和时间数据。

日期/时间数据类型和参数

为了支持新日期和时间数据类型,已向 SqlDbType 中添加了下列枚举。

  • SqlDbType.Date

  • SqlDbType.Time

  • SqlDbType.DateTime2

  • SqlDbType.DateTimeOffset

若要指定 SqlParameter 对象的数据类型,请使用前面的 SqlDbType 枚举值之一。

备注

无法将 DbType 的 SqlParameter 属性设置为 SqlDbType.Date。

若要以泛型方式指定参数类型,请将 DbType 属性设置为 DbType 枚举值。 以下 DbType 值支持 datetime2 数据类型和 datetimeoffset 数据类型:

  • DbType.DateTime2

  • DbType.DateTimeOffset

这些新枚举补充了早期版本的 .NET Framework 中存在的 Date、Time 和 DateTime 枚举。

某一参数对象的 .NET Framework 数据提供程序类型是从该参数对象的 .NET Framework 类型或该参数对象的 DbType 推断而来的。 没有引入新 System.Data.SqlTypes 数据类型来支持新日期和时间数据类型。 下表介绍了 SQL Server 2008 日期和时间数据类型与 CLR 数据类型之间的映射。

SQL Server 数据类型 .NET Framework 类型 System.Data.SqlDbType System.Data.DbType
date System.DateTime Date Date
time System.TimeSpan Time Time
datetime2 System.DateTime DateTime2 DateTime2
datetimeoffset System.DateTimeOffset DateTimeOffset DateTimeOffset
datetime System.DateTime DateTime DateTime
smalldatetime System.DateTime DateTime DateTime

SqlParameter 属性

下表介绍了与日期和时间数据类型相关的 SqlParameter 属性。

属性 说明
IsNullable 获取或设置值是否可为空。 将空参数值发送到服务器时,必须指定 DBNull,而不是 null(在 Visual Basic 中为 Nothing)。 有关数据库 null 值的详细信息,请参阅 Handling Null Values。
Precision 获取或设置用于表示该值的最大位数。 对于日期和时间数据类型,此设置将被忽略。
Scale 获取或设置用于 Time、DateTime2 和 DateTimeOffset 的小数秒精度。 如果未显式设置标度,驱动程序会发送标度 7。 将小数位数显式设置为 0 会要求不保留秒的小数位。
Size 对于日期和时间数据类型,此属性将被忽略。
Value 获取或设置参数值。
SqlValue 获取或设置参数值。

备注

小于零或大于等于 24 小时的时间值会导致 ArgumentException 抛出。

创建参数

使用构造函数创建SqlParameter对象,或在命令的Add集合上调用Parameters方法。 Add 方法接受构造函数参数或现有参数对象。

本主题接下来的几个部分举例介绍了如何指定日期和时间参数。 有关使用参数的其他示例,请参阅配置参数和参数数据类型和 DataAdapter 参数。

日期示例

下面的代码片段展示了如何指定 date 参数。

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@Date";
parameter.SqlDbType = SqlDbType.Date;
parameter.Value = "2007/12/1";
Dim parameter As New SqlParameter()
parameter.ParameterName = "@Date"
parameter.SqlDbType = SqlDbType.Date
parameter.Value = "2007/12/1"

时间示例

下面的代码片段展示了如何指定 time 参数。

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@time";
parameter.SqlDbType = SqlDbType.Time;
parameter.Value = DateTime.Parse("23:59:59").TimeOfDay;
Dim parameter As New SqlParameter()
parameter.ParameterName = "@Time"
parameter.SqlDbType = SqlDbType.Time
parameter.Value = DateTime.Parse("23:59:59").TimeOfDay

datetime2 示例

下面的代码片段展示了如何指定同时包含日期和时间部分的 datetime2 参数。

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@Datetime2";
parameter.SqlDbType = SqlDbType.DateTime2;
parameter.Value = DateTime.Parse("1666-09-02 1:00:00");
Dim parameter As New SqlParameter()
parameter.ParameterName = "@Datetime2"
parameter.SqlDbType = SqlDbType.DateTime2
parameter.Value = DateTime.Parse("1666-09-02 1:00:00")

DateTimeOffSet 示例

下面的代码片段展示了如何指定包含日期、时间和时区偏移 0 的 DateTimeOffset 参数。

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@DateTimeOffSet";
parameter.SqlDbType = SqlDbType.DateTimeOffset;
parameter.Value = DateTimeOffset.Parse("1666-09-02T01:00:00+00:00");
Dim parameter As New SqlParameter()
parameter.ParameterName = "@DateTimeOffSet"
parameter.SqlDbType = SqlDbType.DateTimeOffset
parameter.Value = DateTimeOffset.Parse("1666-09-02T01:00:00+00:00")

AddWithValue

若要提供参数,还可以对命令的 Parameters 集合调用 AddWithValue,如以下代码片段所示。 但是,AddWithValue 不允许为该参数指定 DbType 或 SqlDbType。

command.Parameters.AddWithValue(
    "@date", DateTimeOffset.Parse("1666-09-02T01:00:00+00:00"));
command.Parameters.AddWithValue( _
    "@date", DateTimeOffset.Parse("1666-09-02T01:00:00+00:00"))

对于此值 DateTimeOffset , AddWithValue 推断 SqlDbType.DateTimeOffset。 若要指定其他 SQL Server 日期或时间类型,请显式设置参数的 SqlDbType 属性。

下表展示了哪些 SqlDbTypes 是根据哪些 CLR 类型推断出来的:

CLR 类型 推断 SqlDbType
DateTime SqlDbType.DateTime
TimeSpan SqlDbType.Time
DateTimeOffset SqlDbType.DateTimeOffset

检索日期和时间数据

下表说明用于检索 SQL Server 2008 日期和时间值的方法。

SqlClient 方法 说明
GetDateTime 将指定列的值作为 DateTime 检索。
GetDateTimeOffset 将指定的列值作为 DateTimeOffset 检索。
GetProviderSpecificFieldType 返回作为字段的基础提供程序专用类型的类型。 对于新日期和时间类型,返回与 GetFieldType 相同的类型。
GetProviderSpecificValue 获取指定列的值。 对于新日期和时间类型,返回与 GetValue 相同的类型。
GetProviderSpecificValues 检索指定数组中的值。
GetSqlString 以 SqlString 形式检索列值。 如果数据不能表示为 InvalidCastException,则该方法会引发 SqlString。
GetSqlValue 检索列数据作为默认 SqlDbType。 对于新日期和时间类型,返回与 GetValue 相同的类型。
GetSqlValues 检索指定数组中的值。
GetString 如果 Type System Version 设置为 SQL Server 2005,则以字符串形式检索列值。 如果数据无法表示为字符串,该方法会抛出 InvalidCastException。
GetTimeSpan 将指定的列值检索为 TimeSpan.
GetValue 检索指定列值作为基础 CLR 类型。
GetValues 检索数组中的列值。
GetSchemaTable 在 DataTable 对象中返回结果集的元数据。

备注

正在 SQL Server 中执行的代码不支持新日期和时间 SqlDbTypes。 如果将其中一种类型传递给服务器,则会导致异常抛出。

作为文字指定日期和时间值

可以使用各种不同的文本字符串格式来指定日期和时间数据类型,SQL Server 随后在运行时计算这些格式,并将其转换为内部日期/时间结构。 SQL Server 识别用单引号 (') 括起来的日期和时间数据。 下面的示例展示了一些格式:

  • 字母日期格式,如 'October 15, 2006'。

  • 数字日期格式,如 '10/15/2006'。

  • 如果使用的是 ISO 标准日期格式,未分隔的字符串格式 '20061015'(举个例子)就会解析为 2006 年 10 月 15 日。

小于零或大于等于 24 小时的时间值会导致 ArgumentException 抛出。

SQL Server 文档资源

有关使用 SQL Server 中的日期和时间值的详细信息,请参阅以下文章。

文章 说明
日期和时间数据类型及函数 (Transact-SQL) 概述所有 Transact-SQL 日期和时间数据类型和函数。
使用日期和时间数据 提供日期和时间数据类型和函数的相关信息以及使用示例。
数据类型 (Transact-SQL) 介绍 SQL Server 中的系统数据类型。

请参阅