.NET、SQLServer のうるう秒の扱い
どちらも明示的に生成しようとするとダメだが、そもそも Windows 内部ではこのような時刻が生成されないとのことで、外部システムからの連携がない限り、下で試したようなエラーにはならない。
.NET の DateTime
PS C:\tmp> [datetime]"2015/07/01 08:59:59" 2015年7月1日 8:59:59
PS C:\tmp> [datetime]"2015/07/01 08:59:60" 値 "2015/07/01 08:59:60" を型 "System.DateTime" に変換できません。エラー: "文字列で表される DateTime がカレンダー Syste m.Globalization.GregorianCalendar でサポートされていません。" 発生場所 行:1 文字:11 + [datetime] <<<< "2015/07/01 08:59:60" + CategoryInfo : NotSpecified: (:) []、RuntimeException + FullyQualifiedErrorId : RuntimeException
SQLServer の DateTime
SELECT CONVERT(DateTime, '2015-07-01 08:59:59', 120) ----------------------- 2015-07-01 08:59:59.000 (1 行処理されました)
SELECT CONVERT(DateTime, '2015-07-01 08:59:60', 120) メッセージ 242、レベル 16、状態 3、行 1 varchar データ型から datetime データ型への変換の結果、範囲外の値になりました。
Windows におけるうるう秒について
- Windows オペレーティングシステムでは、うるう秒の処理をおこないません。
- Windows Time サービスでは、うるう秒を意識して動作していません。
- SQL Serverは、トランザクションなど内部で使用する情報の管理に時刻を使用していません。そのため、うるう秒に伴うシステム時刻のズレ(1秒間)が発生したとしても、それが SQL Serverの動作自体に影響を与えることはありません。 Windows オペレーティングシステム (OS) がうるう秒を意識していないのと同様に、SQL Serverもうるう秒を意識して動作していません。
- なお、datetime などの日付データ型は、2012/7/1 08:59:60 というような、秒の部分が60になる時刻には対応していないため、うるう秒に対応している OS 上で動作するアプリケーションから SQL Server に接続し、日付データ型の列や変数にうるう秒 (秒が"60"となるデータ) を設定しようとするとエラーが発生します。
うるう秒に関するサポートについて