SQL Serverのdatetype
データ型は、内部的には2つの32ビットワード(整数)です。上位ワードは、SQL Serverで使用される内部カレンダーのエポック(ゼロポイント)からの日数でのオフセットです。そのエポックは1900年1月1日00:00:00.000です。下位ワードは、1日の始まり(00:00:00.000 /真夜中)からのミリ秒単位のオフセットです。
歴史的な理由から、下位の単語の精度は1ミリ秒です。精度は1/300秒(!?)です。つまり、特定の時点は0、3、または7ミリ秒の増分に丸められます。
SQL Serverと同じ方法で変換を行うには、次の手順を実行します。検討中の実際の時間のミリ秒部分(0から999までの値、100を法とする値)を取得します。これにより、下位桁が得られます。 0-9。したがって、現在の時刻が23:57:23.559の場合、ミリ秒の成分は559です。モジュロ100は9になります。
- 値0および1は、0に「切り捨て」られます。
- 値2、3、および4は、3に「切り捨て」られます。
- 値5、6、7、および8は、7に「切り捨て」られます。
- 9の値は0に切り上げられます。これには、かなり不快で厄介な副作用があります。時間のミリ秒部分が999の場合、1ミリ秒刻みになります。これは、23:59: 59.999の時間が次の日に切り上げられることを意味します。したがって、「2010年12月31日23:59:59.999」を変換すると、日時の値は... 2011年1月1日00:00:00.000になります。
素晴らしい!か何か。
SQL Server 2005 BOLの「備考」セクションを参照してください:http://msdn.microsoft.com/en-us/library/ms187819(v = SQL.90).aspx
このすべての結果は、日付範囲/期間の明確なチェックを行うことができないということです...
where myDateColumn between '1 September 2011 00:00:00.000'
and '30 September 2011 23:59:59.999'
それは潜在的に次の期間からの[小さな]データのチャンクをもたらすからです。そして、あなたは言うことはできません
where myDateColumn between '1 September 2011 00:00'
and '30 September 2011 23:59:59'
その期間に属するデータが除外される可能性があるためです。代わりに、あなたは次のようなことを言わなければなりません
where myDateColumn >= '1 September 2011 00:00:00.000' and myDateColumn < '1 October 2011 00:00:00.000'
、 また
where myDateColumn >= '1 September 2011 00:00:00.000' and myDateColumn <= '30 September 2011 23:59:59.997'
1分の精度を持つ、は同じ偽の動作を示すことに注意してくださいsmalldatetime
。検討中の時間の秒成分が29.998秒以下の場合、最も近い分に切り捨てられます。29.999以上の場合、次の分に切り上げられるため、値は31 Dec 2010 23:59:30.000' winds up as a
smalldatetime value of
1 Jan 2011 00:00:00`になります。
これには、特に課金システムなどに対するWRTなど、あらゆる種類の影響があります。
精度が重要な場合は、SQLServerに日付/時刻の値をISO8601形式の文字列として保存します2011-10-30T23:59:55.1234
(または同等の「コンパクト」形式(20111030T235955.1234
))。ISO8601は適切に照合および比較され、簡単に変換されます。人間が読める形式です。日付( 2011-10-30
)用と時間( )用の2つの列に分割することをお勧めします23:59:55.1234
。次に、3番目の計算列を追加して、すべてをまとめます。
create table foo
(
...
transaction_date char(10) not null ,
transaction_time char(12) not null ,
...
iso8601_transaction_datetime as transaction_date + 'T' + transaction_time ,
...
)
ISO 8601のかなり良い要約は、http: //www.cl.cam.ac.uk/~mgk25/iso-time.htmlにあります。ウィキペディアにもかなり良い情報があります:http://en.wikipedia.org/wiki/ISO_8601。