語言
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.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 型別,或從參數物件的 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 的系統資料型別。 |