语言
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.DateSqlDbType.TimeSqlDbType.DateTime2SqlDbType.DateTimeOffset
若要指定 SqlParameter 对象的数据类型,请使用前面的 SqlDbType 枚举值之一。
备注
无法将 DbType 的 SqlParameter 属性设置为 SqlDbType.Date。
若要以泛型方式指定参数类型,请将 DbType 属性设置为 DbType 枚举值。 以下 DbType 值支持 datetime2 数据类型和 datetimeoffset 数据类型:
DbType.DateTime2DbType.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 中的系统数据类型。 |