2

SQL Server 2005 に複合主キー、つまり外部キー (INT) と DateTime 列を持つテーブルがあります。

SQLを実行すると、

Select column1 From TABLE where ForeignKey=1 and DateTime='08/26/2010 11:24:36'

そのようなレコードがある場合、レコードは返されませんでした。

行うための1つのオプションは

Select column1 From TABLE where ForeignKey=1 and DateTime>='08/26/2010 11:24:36' and DateTime<'08/26/2010 11:24:37'

しかし、それでは、どうやら... 本当にこれに頼る必要があるのでしょうか? それともミリ秒まで指定しなければならないからですか?または解決策はありますか?

助けてください。前もって感謝します。

4

2 に答える 2

2

はい、等式を機能させるには、DateTime 値の精度をミリ秒に一致させる必要があります。

提案された代替案は機能します。別のアイデアとして、キャストと変換を使用して、保存されている日時を秒に切り詰めることができます。ただし、where 句でこれらの関数を使用すると、datetime 列で任意のインデックスを使用するオプティマイザの機能が無効になることに注意してください。特定の環境にどのような影響があるかを判断する必要があります。

/* CONVERT style 20 is yyyy-mm-dd hh:mi:ss */
Select column1 
    From TABLE 
    where ForeignKey=1 
        and CAST(CONVERT(char(19),DateTime,20) as datetime) = '08/26/2010 11:24:36'

編集: 以下のコメントをフォローアップすると、SQL Server が比較で 1 ミリ秒の違いを検出していないように見えることに気付きました。これは、2000/2005/2008 環境に当てはまります。2008 年に新しいdatetime2データ型を使用すると、期待どおりに動作します。日時データ型を読み取ると、ミリ秒部分の精度が丸められます。

精度: .000、.003、または .007 秒単位で丸められます

declare @datetime1 datetime
declare @datetime2 datetime
declare @datetime3 datetime
declare @datetime4 datetime

set @datetime1 = '2010-08-30 08:41:51.513'
set @datetime2 = '2010-08-30 08:41:51.513'
set @datetime3 = '2010-08-30 08:41:51.514'
set @datetime4 = '2010-08-30 08:41:51.515'

/* Expected result 'Equal'; Actual result 'Equal' */
if @datetime1 = @datetime2
    print 'Equal'
else
    print 'Not Equal'

/* Expected result 'Not Equal'; Actual result 'Equal' */    
if @datetime1 = @datetime3
    print 'Equal'
else
    print 'Not Equal'

/* Expected result 'Not Equal'; Actual result 'Not Equal' */    
if @datetime1 = @datetime4
    print 'Equal'
else
    print 'Not Equal'
于 2010-08-26T13:37:47.347 に答える
0

可能であれば、日時フィールドをキーとして使用しないでください。代わりに、別のキーを作成し、日時の値にインデックスを付けるだけです。

于 2010-08-30T14:56:10.377 に答える