Language
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 の 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 (協定世界時またはグリニッジ標準時) からタイム ゾーン オフセットを加算するか減算するかを示します。 |
注
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 の終了年の規則に従って決定されます。この規則では、世紀の値を割り当てるための終了日が定義されます。 詳しくは、「2桁の年のカットオフ オプション」をご覧ください。
注
YDM日付形式は、文字列形式からdate、time、datetime2、またはdatetimeoffsetに変換する場合はサポートされません。
SQL Server による日付と時刻のデータの解釈方法について詳しくは、「日時データの使用」をご覧ください。
Date/Time データ型とパラメーター
新しい日付型と時刻型をサポートするために、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 から推論されます。 新しい 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 プロパティの説明です。
| プロパティ | 説明 |
|---|---|
| IsNullable | 値が null 許容であるかどうかを取得または設定します。 サーバーに NULL パラメーター値を送る場合は、DBNull (Visual Basic の場合は null) ではなく、Nothing を指定する必要があります。 データベースの NULL 値の詳細については、「 Handling Null Values」を参照してください。 |
| Precision | その値の最大桁数を取得または設定します。 この設定は日付と時刻のデータ型では無視されます。 |
| Scale |
Time、DateTime2、およびDateTimeOffsetの秒の小数部の有効桁数を取得または設定します。 スケールを明示的に設定しない場合、ドライバーはスケール 7 を送信します。 スケールを明示的に 0 に設定すると、秒以下の桁数が 0 になります。 |
| Size | 日付と時刻のデータ型では無視されます。 |
| Value | パラメーター値を取得または設定します。 |
| SqlValue | パラメーター値を取得または設定します。 |
注
0 時未満または 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 の例
次のコード フラグメントは、DateTimeOffset パラメーターの日付と時刻、およびタイム ゾーン オフセット 0 を指定する方法を示しています。
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 プロパティを明示的に設定します。
次の表は、どの 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 として取得します。 データをInvalidCastExceptionとして表すことができない場合、メソッドはSqlStringをスローします。 |
| GetSqlValue | 列データをその既定の SqlDbType として取得します。 新しい日付と時刻の型に対して GetValue と同じ型を返します。 |
| GetSqlValues | 指定した配列内の値を取得します。 |
| GetString | Type System Version が SQL Server 2005 に設定されている場合、列の値を文字列として取得します。 データを文字列として表現できない場合、メソッドは InvalidCastException をスローします。 |
| GetTimeSpan | 指定した列の値を TimeSpanとして取得します。 |
| GetValue | 指定した列の値を、その基になる CLR 型として取得します。 |
| GetValues | 配列内の列の値を取得します。 |
| GetSchemaTable | DataTable オブジェクト内の結果セットのメタデータを返します。 |
注
新しい日付と時刻の 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 でのシステム データ型について説明します。 |