語言

日期和時間資料

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 日。 預設值為 1900 年 1 月 1 日。 儲存體大小是 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 表示時區位移中的 2 位數時數,範圍介於 00 至 14 之間。 MM 是代表時區位移中額外分鐘數的 2 位數,範圍介於 00 至 59 之間。 時間格式可支援到 100 奈秒。 強制性的 + 或 - 符號指出是否要從 UTC (世界標準時間或格林威治標準時間) 增加或扣除時區位移,以取得當地時間。

注意

如需使用 Type System Version 關鍵字的詳細資訊,請參閱 ConnectionString。

日期格式和日期順序

SQL Server 剖析日期和時間值的方式,不僅取決於類型系統版本和伺服器版本,也會根據伺服器的預設語言和格式設定而定。 如果查詢會透過使用不同語言和日期格式設定的連線來執行,則可能無法辨識適用於某種語言之日期格式的日期字串。

Transact-SQL SET LANGUAGE 陳述式會隱含地設定決定日期部分順序的 DATEFORMAT。 你可以在連線中使用 SET DATEFORMAT Transact-SQL 語句,依照 MDY、DMY、MYD、YMD、YDM 或 DYM 的順序排列日期部分,以消除日期值的歧義。

如果你沒有為連線指定任何語言DATEFORMAT,SQL Server 會使用與該連線相關的預設語言。 例如,日期字串「01/02/03」在語言設定為 美國 English 的伺服器上會解讀為 MDY(January 2, 2003),在語言設定為英式英語的伺服器上則解讀為 DMY(February 1, 2003)。 年份會使用 SQL Server 的截止年份規則來決定,這會定義用來指派世紀值的截止日期。 如需詳細資訊,請參閱兩位數年份截止選項。

注意

從字串格式轉換為 time、datetime2、datetimeoffset 或 YDM 時,不支援 date 日期格式。

深入瞭解 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 型別,或從參數物件的 DbType 推斷出參數物件的 .NET Framework 資料提供者型別。 尚未引進任何新的 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 取得或設定值是否可為 Null。 當您將 Null 參數值傳送到伺服器時,必須指定 DBNull,而不是 null (在 Visual Basic 中為 Nothing)。 如需資料庫 null 值的詳細資訊,請參閱 Handling Null Values。
Precision 取得或設定用來表示值的最大位數。 系統會針對日期和時間資料類型忽略此設定。
Scale 取得或設定 DateTime2、DateTimeOffset 和 Time 的秒的小數精確度。 如果你沒有明確設定 scale,驅動程式會發送 scale 7。 明確將刻度設為 0 時,請求零秒的小數位數。
Size 日期和時間資料類型被忽略。
Value 取得或設定參數值。
SqlValue 取得或設定參數值。

注意

小於零或大於等於 24 小時的時間值,將會引發 ArgumentException。

建立參數

用建構子 Parameters 建立物件,或在命令的 Add 集合上呼叫 SqlParameter 方法。 此 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'。

  • 未分隔的字串格式,例如 '20061015',如果您使用 ISO 標準日期格式,則會將其解譯為 2006 年 10 月 15 日。

小於零或大於等於 24 小時的時間值,將會引發 ArgumentException。

SQL Server 文件資源

如需在 SQL Server 使用日期與時間值的詳細資訊,請參閱下列文章。

文章 說明
日期和時間資料類型與函數 (Transact-SQL) 提供所有 Transact-SQL 日期和間資料類型與函式的概觀。
使用日期和時間資料 提供日期和時間資料類型與函式的詳細資訊,以及使用範例。
資料類型 (Transact-SQL) 說明 SQL Server 的系統資料型別。

另請參閱