SQL Server 2008 における日付と時刻のデータ (ADO.NET)
更新 : November 2007
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 オンライン ブックに記載されています。次の表は、バージョン別の日付と時刻のデータに関する初歩的なトピックの一覧です。
SQL Server 2000 |
SQL Server 2005 |
SQL Server 2008 |
---|---|---|
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 型の範囲および有効桁数を単一のデータ型として組み合わせたものです。 既定値および文字列リテラルの形式は、date 型および time 型で定義されているものと同じです。 |
datetimeoffset |
datetimeoffset データ型は、datetime2 のすべての機能に加えて、タイム ゾーン オフセットを持ちます。タイム ゾーン オフセットは、[+|-] HH:MM として表されます。HH は、タイム ゾーン オフセットの時間数を表す 00 ~ 14 の 2 桁の数字です。MM は、タイム ゾーン オフセットの付加的な分数を表す 0 ~ 59 の 2 桁の数字です。時刻の精度は 100 ナノ秒までサポートされます。必須の + 記号または - 記号は、ローカル時刻を取得する際、UTC (協定世界時またはグリニッジ標準時) を基準としてタイム ゾーン オフセットを加算するか、減算するかを示します。 |
メモ : |
---|
接続文字列内で Type System Version が明示的に SQL Server 2008 以降に設定されていない場合、datetime の値は既定値の SQL Server 2005 型システムによって処理されます。Type System Version キーワードの使用方法の詳細については、「SQL Server 2008 の新機能 (ADO.NET)」を参照してください。 |
日付書式と表記順序
SQL Server が日付と時刻の値をどのように処理するかは、型システムのバージョンとサーバーのバージョンだけでなく、サーバーの既定の言語と書式設定にも左右されます。日付文字列が、ある言語の日付書式で有効な場合でも、別の言語と日付書式を使用している接続でクエリを実行した場合には意味を持たない可能性があります。
Transact-SQL の SET LANGUAGE ステートメントは、日付の構成要素の並べ方を決定する DATEFORMAT を暗黙に設定します。日付構成要素の表記順序が MDY、DMY、YMD、YDM、MYD、DYM のいずれであるかを明確にするには、接続で Transact-SQL の SET DATEFORMAT ステートメントを使用します。
接続で DATEFORMAT を指定しないと、SQL Server はその接続に関連付けられている既定の言語を使用します。たとえば、日付文字列 '01/02/03' は、言語が United States English に設定されているサーバーでは MDY (January 2, 2003) として、British English に設定されているサーバーでは DMY (February 1, 2003) として処理されます。年は、SQL Server の終了年の規則に従って決定されます。この規則では、世紀の値を割り当てるための終了日が定義されます。詳細については、SQL Server オンライン ブックの「two digit year cutoff オプション」を参照してください。
メモ : |
---|
YDM 日付書式は、文字列形式から date、time、datetime2、または datetimeoffset に変換する場合にはサポートされません。 |
SQL Server で日付と時刻のデータがどのように解釈されるかの詳細については、SQL Server 2008 オンライン ブックの「日時データの使用」を参照してください。
日付/時刻データ型とパラメータ
SqlParameter のデータ型は、SqlDbType 列挙型のいずれかの値を使って指定できます。新しい日付型と時刻型をサポートするために、SqlDbType には、次の列挙値が追加されています。
SqlDbType.Date
SqlDbType.Time
SqlDbType.DateTime2
SqlDbType.DateTimeOffSet
SqlParameter オブジェクトの DbType プロパティを特定の DbType 列挙値に設定することによって、SqlParameter の型をジェネリックに指定することもできます。datetime2 データ型と datetimeoffset データ型をサポートするために、DbType には、次の列挙値が追加されています。
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 |
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 プロパティの説明です。
プロパティ |
説明 |
---|---|
値を NULL に設定できるかどうかを取得または設定します。サーバーに NULL パラメータ値を送る場合は、null (Visual Basic の場合は Nothing) ではなく、DBNull を指定する必要があります。データベースの NULL 値の詳細については、「NULL 値の処理 (ADO.NET)」を参照してください。 |
|
その値の最大桁数を取得または設定します。この設定値は date データ型と time データ型では無視されます。 |
|
小数点以下の桁数を取得または設定します。これは Time、DateTime2、および DateTimeOffset の時刻部分の値の処理で使用されます。既定値は 0 です。これは、実際の桁数が値から推論されてサーバーに送られることを意味します。 |
|
date データ型と time データ型では無視されます。 |
|
パラメータ値を取得または設定します。 |
|
パラメータ値を取得または設定します。 |
メモ : |
---|
時刻の値が 0 と 24 の間にない場合は、ArgumentException がスローされます。 |
パラメータの作成
SqlParameter オブジェクトは、そのコンストラクタを使って作成できるほか、SqlParameterCollection の Add メソッドを呼び出して、SqlCommandParameters コレクションにそれを追加することによって作成することもできます。Add メソッドは、入力としてコンストラクタ引数または既存のパラメータ オブジェクトを受け取ります。
このトピックの次のセクションでは、日付と時刻のパラメータを指定する方法の例を示します。パラメータの使用方法を示すその他の例については、「パラメータおよびパラメータのデータ型の構成 (ADO.NET)」および「DataAdapter パラメータ (ADO.NET)」を参照してください。
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 データ型との下位互換性の問題が発生する場合があります。
次の表は、どの SqlDbType がどの CLR 型から推論されるかを示しています。
CLR 型 |
推論される SqlDbType |
---|---|
DateTime |
SqlDbType.DateTime |
TimeSpan |
SqlDbType.Time |
DateTimeOffset |
SqlDbType.DateTimeOffset |
日付と時刻データの取得
SQL Server 2008 の日付値および時刻値を取得するためのメソッドを次の表に示します。
SqlClient のメソッド |
説明 |
---|---|
指定された列の値を DateTime 構造体として取得します。 |
|
指定された列の値を DateTimeOffset 構造体として取得します。 |
|
特定のフィールドについて、基になるプロバイダ固有の型を返します。新しい date 型および time 型については、GetFieldType と同じ型が返されます。 |
|
指定された列の値を取得します。新しい date 型および time 型については、GetValue と同じ型が返されます。 |
|
指定された配列の値を取得します。 |
|
列の値を SqlString として取得します。データを SqlString で表現できない場合、InvalidCastException が発生します。 |
|
列データを対応する既定の SqlDbType として取得します。新しい date 型および time 型については、GetValue と同じ型が返されます。 |
|
指定された配列の値を取得します。 |
|
Type System Version が SQL Server 2000 または SQL Server 2005 に設定されている場合、列の値を文字列として取得します。データを文字列で表現できない場合、InvalidCastException が発生します。 |
|
指定された列の値を Timespan 構造体として取得します。 |
|
指定された列の値を、基になる CLR 型として取得します。 |
|
配列内の列の値を取得します。 |
|
結果セットのメタデータを表す DataTable を返します。 |
メモ : |
---|
新しい日付と時刻の SqlDbType は、SQL Server 内でインプロセスで実行されるコードではサポートされません。そのような型の 1 つがサーバーに渡されると、例外が発生します。 |
日付値と時刻値のリテラル指定
日付と時刻のデータ型は、さまざまなリテラル文字列形式を使用して指定できます。SQL Server は、実行時にそれらを内部の日付/時刻構造体に変換します。SQL Server は、単一引用符 (') で囲まれた日付と時刻のデータを認識します。次に文字列形式の例を示します。
英数字の日付書式 ('October 15, 2006' など)。
数字の日付書式 ('10/15/2006' など)。
区切りなしの文字列形式 ('20061015' など)。これは ISO 規格の日付書式では 2006 年 10 月 15 日と解釈されます。
メモ : |
---|
すべてのリテラル文字列形式と日付/時刻データ型のその他の特徴については、SQL Server オンライン ブックに完全な説明が記載されています。 |
時刻の値が 0 と 24 の間にない場合は、ArgumentException がスローされます。
SQL Server 2008 オンライン ブックの関連トピック
SQL Server 2008 での日付値と時刻値の使用方法の詳細については、SQL Server 2008 オンライン ブックで次の関連トピックを参照してください。
トピック |
説明 |
---|---|
Transact-SQL の日付と時刻のデータ型および関数の概要について説明します。 |
|
日付と時刻のデータ型と関数の情報、および使用例を示します。 |
|
SQL Server 2008 のシステム データ型について説明します。 |
参照
概念
SQL Server データ型のマッピング (ADO.NET)
パラメータおよびパラメータのデータ型の構成 (ADO.NET)