日付型と時刻型のデータ
SQL Server 2008 では、日付と時刻の情報を処理するための新しいデータ型が導入されました。 新しいデータ型には、日付と時刻の個別の型と、より大きな範囲、精度、およびタイムゾーンに対応する拡張データ型が含まれます。 .NET Framework 3.5 Service Pack (SP) 1 以降では、.NET Framework Data Provider for SQL Server (System.Data.SqlClient) が SQL Server 2008 データベース エンジンの新機能すべてをサポートします。 SqlClient でこれらの新機能を使用するには、.NET Framework 3.5 SP1 以降をインストールする必要があります。
SQL Server 2008 より前のバージョンの SQL Server では、日付と時刻に使用できるデータ型には datetime
と smalldatetime
の 2 つしかありませんでした。 どちらのデータ型も日付値と時刻値の両方を保持するため、日付と時刻のどちらか一方の値のみを使用するのが困難でした。 さらに、これらのデータ型では、1753 年に英国でグレゴリオ暦が導入された後の日付のみがサポートされます。 もう 1 つの制限事項は、これらの古いデータ型がタイムゾーンに対応していないことです。これにより、複数のタイムゾーンからのデータの操作が困難になります。
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 (午前 0 時) です。 time データ型はユーザー定義による 1 秒未満の時間の有効桁数をサポートし、記憶領域のサイズは、指定された有効桁数に応じて 3 バイト~ 6 バイトになります。 |
datetime2 |
datetime2 データ型では、date データ型と time データ型の範囲と精度が 1 つのデータ型に結合されます。既定値と文字列リテラルの形式は、 date データ型および time データ型で定義されているものと同じです。 |
datetimeoffset |
datetimeoffset データ型は、datetime2 のすべての機能に加えて、タイム ゾーン オフセットを持ちます。 タイム ゾーン オフセットは、[+|-] HH:MM として表されます。 HH は、タイム ゾーン オフセットの時間数を表す 00 ~ 14 の 2 桁の数字です。 MM は、タイム ゾーン オフセットの付加的な分数を表す 0 ~ 59 の 2 桁の数字です。 時刻の精度は 100 ナノ秒までサポートされます。 必須の + または - 記号は、ローカル時刻を取得するために、UTC (協定世界時またはグリニッジ標準時) からタイム ゾーン オフセットを加算するか減算するかを示します。 |
Note
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 の終了年の規則に従って決定されます。この規則では、世紀の値を割り当てるための終了日が定義されます。 詳しくは、「two digit year cutoff オプション」をご覧ください。
Note
YDM 日付書式は、文字列形式から date
、time
、datetime2
、または datetimeoffset
に変換する場合にはサポートされません。
SQL Server による日付と時刻のデータの解釈方法について詳しくは、「日時データの使用」をご覧ください。
Date/Time データ型とパラメーター
新しい日付型と時刻型をサポートするために、SqlDbType には、次の列挙値が追加されています。
SqlDbType.Date
SqlDbType.Time
SqlDbType.DateTime2
SqlDbType.DateTimeOffSet
SqlParameter のデータ型は、前の SqlDbType 列挙型のいずれかの値を使って指定できます。
Note
SqlParameter
の DbType
プロパティは SqlDbType.Date
に設定できません。
SqlParameter オブジェクトの DbType プロパティを特定の SqlParameter
列挙値に設定することによって、DbType の型をジェネリックに指定することもできます。 DbType データ型と datetime2
データ型をサポートするために、datetimeoffset
には、次の列挙値が追加されています。
DbType.DateTime2
DbType.DateTimeOffset
これらの新しい列挙値は、以前のバージョンの .NET Framework に存在した Date
、Time
、および DateTime
の各列挙値を補います。
パラメーター オブジェクトの .NET Framework データ プロバイダー型は、パラメーター オブジェクトの値の .NET Framework 型か、またはパラメーター オブジェクトの DbType
から推論されます。 新しい date 型と time 型をサポートするための新しい System.Data.SqlTypes データ型は導入されていません。 次の表に、SQL Server 2008 の日付と時刻のデータ型と CLR データ型のマッピングについて説明します。
SQL Server のデータ型 | .NET Framework 型 | System.Data.SqlDbType | System.Data.DbType |
---|---|---|---|
date | System.DateTime | Date | Date |
時間 | System.TimeSpan | 時刻 | 時刻 |
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 (Visual Basic の場合は null ) ではなく、Nothing を指定する必要があります。 データベースの NULL 値の詳細については、「 Handling Null Values」を参照してください。 |
Precision | その値の最大桁数を取得または設定します。 この設定は日付と時刻のデータ型では無視されます。 |
Scale | 小数点以下の桁数を取得または設定します。これは Time 、DateTime2 、DateTimeOffset の時刻部分の値の処理で使用されます。 既定値は 0 で、これは実際のスケールが値から推論され、サーバーに送信されることを意味します。 |
Size | 日付と時刻のデータ型では無視されます。 |
Value | パラメーター値を取得または設定します。 |
SqlValue | パラメーター値を取得または設定します。 |
Note
時刻の値が 0 と 24 の間にない場合は、ArgumentException がスローされます。
パラメーターの作成
SqlParameter オブジェクトは、そのコンストラクターを使って作成できるほか、SqlCommand の Parameters メソッドを呼び出して、Add
SqlParameterCollection コレクションにそれを追加することによって作成することもできます。 Add
メソッドは、入力としてコンストラクター引数または既存のパラメーター オブジェクトを受け取ります。
このトピックの次のセクションでは、日付と時刻のパラメーターを指定する方法の例を示します。 パラメーターの使用に関するその他の例については、「パラメーターおよびパラメーター データ型の構成」および「DataAdapter パラメーター」をご覧ください。
Date の例
次のコード フラグメントは、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 の例
次のコード フラグメントは、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 の例
次のコード フラグメントは、DateTimeOffSet
パラメーターの日付と時刻、およびタイム ゾーン オフセット 0 を指定する方法を示しています。
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@DateTimeOffSet";
parameter.SqlDbType = SqlDbType.DateTimeOffSet;
parameter.Value = DateTimeOffset.Parse("1666-09-02 1:00:00+0");
Dim parameter As New SqlParameter()
parameter.ParameterName = "@DateTimeOffSet"
parameter.SqlDbType = SqlDbType.DateTimeOffSet
parameter.Value = DateTimeOffset.Parse("1666-09-02 1:00:00+0");
AddWithValue
次のコード フラグメントに示すように、SqlCommand の AddWithValue
メソッドを使用してパラメーターを指定することもできます。 ただし、AddWithValue
メソッドでは、パラメーターの DbType または SqlDbType を指定することはできません。
command.Parameters.AddWithValue(
"@date", DateTimeOffset.Parse("16660902"));
command.Parameters.AddWithValue( _
"@date", DateTimeOffset.Parse("16660902"))
@date
パラメーターは、サーバー上の date
、datetime
、または datetime2
データ型にマッピングできます。 新しい datetime
データ型を使用する場合は、パラメーターの SqlDbType プロパティをインスタンスのデータ型に明示的に設定する必要があります。 Variant を使用するか、または暗黙的にパラメーター値を指定すると、datetime
データ型および smalldatetime
データ型との下位互換性の問題が発生する可能性があります。
次の表は、どの CLR 型からどの SqlDbTypes
が推論されるかを示しています。
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 として取得します。 データを SqlString として表現できない場合、InvalidCastException が発生します。 |
GetSqlValue | 列データをその既定の SqlDbType として取得します。 新しい日付と時刻の型に対して GetValue と同じ型を返します。 |
GetSqlValues | 指定した配列内の値を取得します。 |
GetString | Type System Version が SQL Server 2005 に設定されている場合、列の値を文字列として取得します。 データを文字列として表現できない場合、InvalidCastException が発生します。 |
GetTimeSpan | 指定された列の値を TimeSpan 構造体として取得します。 |
GetValue | 指定した列の値を、その基になる CLR 型として取得します。 |
GetValues | 配列内の列の値を取得します。 |
GetSchemaTable | 結果セットのメタデータを記述する DataTable を返します。 |
Note
新しい日付と時刻の SqlDbTypes
は、SQL Server でインプロセスで実行されているコードではサポートされていません。 そのような型の 1 つがサーバーに渡されると、例外が発生します。
日付値と時刻値のリテラル指定
日付と時刻のデータ型は、さまざまなリテラル文字列形式を使用して指定できます。SQL Server は、実行時にそれらを内部の日付/時刻構造体に変換します。 SQL Server では、一重引用符 (') で囲まれた日付と時刻のデータが認識されます。 次の例に、いくつかの形式を示します。
アルファベットの日付形式 (
'October 15, 2006'
など)。数値の日付形式 (
'10/15/2006'
など)。区切られていない文字列形式 (
'20061015'
など。これは ISO 標準日付形式を使用している場合、2006 年 10 月 15 日と解釈される)。
時刻の値が 0 と 24 の間にない場合は、ArgumentException がスローされます。
SQL Server ドキュメントのリソース
SQL Server での日付と時刻の値の使用方法の詳細については、以下の記事を参照してください。
[アーティクル] | 説明 |
---|---|
日付と時刻のデータ型および関数 (Transact-SQL) | Transact-SQL の日付と時刻のデータ型および関数の概要について説明します。 |
日時データの使用 | 日付と時刻のデータ型と関数の情報、および使用例を示します。 |
データ型 (Transact-SQL) | SQL Server でのシステム データ型について説明します。 |