この Web ページでは、Enterprise Editionと Small Business Server の両バージョンを対象とします。
日付の処理
1) サーバー
SQL Server には、datetime と smalldatetime という 2 つの日付/時刻データ型があります。datetime データ型は 2 つの 4 バイトの整数 (8 バイト) で保存されます。最初の 4 バイトは基本日付である 1900 年 1 月 1 日までの日数またはそれ以降の日数、残りの 4 バイトは午前 0 時 0 分 0 秒以降のミリ秒数を表します。datetime の対応期間は 1753 年 1 月 1 日~ 9999 年 12 月 31 日です。精度は、300 分の 1 秒 (3.33 ミリ秒) です。
smalldatetime データ型は datetime よりも精度が低くなります。このデータ型は 4 バイトで保存されます。最初の 2 バイトの整数には 1900 年 1 月 1 日以降の日数、残りの 2 バイトの整数には午前 0 時 0 分 0 秒以降の分数が保存されます。smalldatetime の対応期間は、1900 年 1 月 1 日~ 2079 年 6 月 6 日です。精度は、分単位です。
どちらのデータ型でも、西暦の下 2 桁で指定できます。ただし、下 2 桁で指定された場合でも、4 桁の西暦として保存されます。下 2 桁として 50 以下が指定された場合は上 2 桁が 20、50 より大きい値が指定された場合は上 2 桁が 19 として解釈されます。たとえば、下 2 桁として "03" が指定された場合、西暦は 2003 年として保存されます。"82" が指定された場合、1982 年として保存されます。
2) SQL 管理ツール
SQL 管理ツールには、SQL Enterprise Manager、SQL トレース、ISQL/w、セキュリティ マネージャ、クライアント設定ユーティリティ、サービス マネージャ、SQL Server Executive、Web Assistant、および SQL 保守計画ウィザードがあります。これらの一部では、日付情報の表示と入力を行うことができます。
日付の表示
SQL Server エンジン の形式または Windows NT のコントロール パネルの設定を使用します。
日付の入力
日付の入力には、編集フィールドまたは日付コントロールが使用されます。サーバーに日付情報をトランスポートする手段としては、ストアド プロシージャ、SQLOLE、DB-Library、SQL Server ODBC ドライバ、Net-Libraryがあります。入力された日付の有効性は、datetime データ型に対して、SQL Server エンジン レベルで検証されます。SQL Server Executive と 、SQL Server のタスクと警告スケジュール エンジンは例外です。つまり、スケジュール タスクの日付情報は整数のデータ型で保存され、入力された日付の有効性はユーザー インターフェイスの日付コントロールで検証されます。また、データベースに保存する前に、ストアド プロシージャ内の SQL Server の ISDATE() 関数で検証されます。
下 2 桁の西暦の処理
SQL Server エンジンでは、datetime データ型の西暦を下 2 桁で入力できます。 西暦が下 2 桁で入力された場合も、4 桁の西暦として保存されます。その場合、下 2 桁として 50 より小さい値が指定された場合は上 2 桁が 20、50 以上の値が指定された場合は上 2 桁が 19 として解釈されます。たとえば、下 2 桁として "25" が指定された場合、西暦は 2025 年として保存されます。"50" が指定された場合、1950 年として保存されます。
未対応の日付処理
SQL Server 6.5 Service Pack 2 ~ 4 をテストした結果、次の問題が確認されました。これらの問題は、Service Pack 5a にて解決されます。
- DUMP DATABASE の EXPIREDATE 句で、2000 年以降の日付が正しく処理されません。EXPIREDATE は、バックアップ メディアを再利用できるかどうかを示す場合に使用されます。この問題が発生しても、SQL Server の全般的な操作には影響ありません。起こりえる問題は、間違ってバックアップ メディアを上書きしてしまうことと、EXPIREDATE で提供されるほかの安全性のチェックが行われないことです。この問題は、SQL Server 6.5 Service Pack 5 以上で修正されます。
- システム時刻が 99 年 12 月 31 日を過ぎると、DUMP DATABASE の RETAINDAYS 句が正しく機能しなくなります。その結果、既存のダンプを上書きできなくなります。この問題を回避するには、既存のダンプ イメージを手動で削除し、その後で DUMP を実行します。この問題は、SQL Server 6.5 Service Pack 5 以上で修正されます。SQL Server Executive では、2000 年はうるう年として認識されません。この問題は、SQL Server 6.5 Service Pack 2 以上で修正されます。
- タスク マネージャのユーザー インターフェイスであるスピン ボックスでは、2000 年がうるう年として認識されません。この問題を回避するには、ユーザー インターフェイスを使用せずに、ストアド プロシージャを実行して直接タスクをスケジュールすることです。この問題は、SQL Server 6.5 Service Pack 5 以上で修正されます。
- Web Assistant では、2000 年以降のタスクをスケジュールできません。この問題を回避するには、ユーザー インターフェイスを使用せずに、ストアド プロシージャ SP_MAKEWEBTASK を使用することです。この問題は、SQL Server 6.5 Service Pack 5 以上で修正されます。
- ストアド プロシージャ SP_ADDTASK、SP_PURGEHISTORY、SP_UPDATEALERT では、入力パラメータとして無効な日付をいくつか受け付けます。これは、入力パラメータとして有効な日付が使用される限り、問題にはなりません。この問題は、SQL Server 6.5 Service Pack 5 以上で修正されます
- MS Query クライアント ツールでは、ユーザーの ODBC クエリーに対して、下 2 桁の西暦を受け付けます。ただし、西暦の上 2 桁は "19" と解釈されます。この問題を回避するには、MS Query の日付データに基づくクエリーに、4 桁の西暦を使用します。または、ISQL/w または Enterprise Manager など、SQL Server のほかのクライアント ツールを使用します。この問題は、SQL Server 6.5 Service Pack 5 以上で修正されます。
推奨事項
2000 年問題に対応させるためには、SQL Server 6.5 Service Pack 5a に更新してください。
ガイドラインと推奨事項
- データベース スキーマを調べ、smalldatetime データ型が使用されているかどうかを確認します。使用されている場合は、必要に応じて、datetime に変換して精度を上げます。
- 西暦を 4 桁で入力し、アプリケーションで日付や処理できる期間があいまいにならないようにします。
- SQL Server をバックエンドとして、フロントエンド アプリケーションの動作と、ほかのアプリケーションとのやり取りを調べます。
SQL Server テストの概要
サブシステム |
コンポーネント |
テストの概要 |
SQL Server |
日付の関数
-convert
-datepart
-dateadd
-datediff
-datename
-datepart
-getdate
-style
dateformat
datefirst
ユーティリティ
-dbcc (データベース一貫性チェッカ)
-dump
dump database
dump transaction
dump table
-update statistics
Transact SQL
-delete
-insert
-select
order by
group by
having
-update |
- 西暦が 1900 年または 2000 年として解釈できるエントリに対して、datetime をテストします。1999 年から 2001 年までの西暦の切り替わりや、西暦何年まで処理できるのかについてもテストします。
- DBCC の show_statistics オプションをテストし、指定されたテーブルのインデックスで、必要な統計情報がディストリビューション ページに保存されていることを確認します。統計を更新し、同じテストを行います。
- Expiredate と Retaindays をテストし、ダンプ メディアの期限が終了する日付と、その結果上書きできるようになる日付が正しいことを確認します。1999 年から 2001 年までの西暦の切り替わりや、西暦何年まで処理できるのかについてもテストします。
- サーバーで各コマンドをテストし、日付を正しく解釈することを確認します。これは、通常のユーザ入力、2000 年、1900 年、1753 年に対してテストします。日付関数に関係があるので、ソート メソッドもテストします。
- SET dateformat オプションをテストし、各国の日付入力に対応していることを確認します。
|
SQL Server Executive |
タスク/警告のスケジュール |
- 2000 年より前、2000 年の間、2000 年より後のタスクのスケジュールをテストします。また、2000 年より前にスケジュールされたタスクで、実際には 2000 年の間または 2000 年より後に起こるものに対してテストします。
- ユーザー インターフェイスでは、西暦を下 2 桁で入力できます。ただし、その場合も西暦は 4 桁で保存されます。
|
レプリケーション |
テーブルの定期更新 |
- レプリケーションには、日付に関連した機能はありません。レプリケーションでは、データを定期更新できます。ただし、これは SQL Server Executive のスケジュール メカニズムに依存します。
|
インターフェイス |
BCP、ISQL、DB-library、RPC、SQL Server ODBC ドライバ (Version 3.60 ~ 3.70)、SQL Server OLE DB プロバイダ (7.01) |
- API レベルで、2000 年に対するテストを行います。
|
Web Assistant |
Web ページを生成するスケジュール オプション |
- レプリケーションと同様に、Web Assistant ではスケジュール メカニズムに SQL Server Executive が使用されます。通常のユーザー入力に対して、Web assistant 固有のユーザー インターフェイスをテストします。
|
SQL DMO |
オブジェクト
Alert
Backup
Database
Default
HistoryFilter
Operator
StoredProcedure
Table
Task
TransactionLog
Trigger
View |
- DMO の日付関連のオブジェクトをテストし、2000 年より前、2000 年、2000 年より後の日付に対して、予測されたとおりに西暦を解釈して、正しく機能することを確認します。
|