2

SQL Server 2005:

次のビュー

  SELECT CONVERT(VARCHAR(20), keyedtimestamp, 101) as KeyedDate
    FROM TMSSTATFILE_STATS a                                                                
   WHERE (CONVERT(VARCHAR(20), a.KeyedTimestamp, 101) BETWEEN '03/01/2011' And '03/31/2011')  
ORDER BY KeyedDate

2011 年 3 月 2 日から 2011 年 3 月 31 日までのキー日付の結果が表示されます。

最初の日付を 03/00/2011 に変更した場合

  SELECT CONVERT(VARCHAR(20), keyedtimestamp, 101) as KeyedDate
    FROM TMSSTATFILE_STATS a                                                                
   WHERE (CONVERT(VARCHAR(20), a.KeyedTimestamp, 101) BETWEEN '03/00/2011' And '03/31/2011')  
ORDER BY KeyedDate

2011 年 3 月 1 日から 2011 年 3 月 31 日までの日付のデータが得られるようになりました。

KeyedTimestamp フィールドは DateTime であり、これらのレコードに関連付けられた時刻があります。2011 年 3 月 31 日のすべてのレコードが考慮されます。間に2番目の日付の最大時間を指定することで代わりにこれを行うことができることを知っているので、代わりのwhere句を探しているのではなく、最初のレコードを組み込んでいるにもかかわらず、最初のレコードを無視している理由を理解しています31日から。

まるで 2011 年 3 月 1 日 23:59:59 をチェックしているかのように、時間ではなく日付だけを気にするこの種のチェックをなくしたいと思っていました。

4

4 に答える 4

9

BETWEEN を使用しないことで、列に対する関数を回避します。関数は、インデックスが使用されないことを意味します

WHERE
    a.KeyedTimestamp >= '20110301' AND a.KeyedTimestamp < '20110401'  

また、SQL Server 2008 より前の yyyymmdd唯一の安全な日付形式です。

于 2011-05-09T16:59:06.803 に答える
3

日時を文字列に変換するべきではありません。代わりに、日時として比較してください。保存されている時間の問題を回避しようとしているようです:

Select DateAdd(d, DateDiff(d, 0, T.KeyedTimeStamp), 0) As KeyedDate
From TMSSTATFILE_STATS As T
Where T.KeyedTimeStamp >= '20110301'
    And T.KeyedTimeStamp < DateAdd(m,1,'20110301')

DateTimeVal Between DateTimeA And DateTimeBに変換されることに注意してくださいDateTimeVal >= DateTimeA And DateTimeVal <= DateTimeB。つまり、両方のエンドポイントが含まれます。上記のソリューションでは、翌月の最初の日を取得し、その値よりも厳密に小さいすべての値を要求しています。これは、3 月のすべての値 (時刻を含む) が含まれることを意味します。最後に、Select ステートメントは、返されたすべての KeyedTimeStamp 値から時間値を取り除きます。

于 2011-05-09T16:57:31.773 に答える
2

値に変換DATETIME(または同様のもの) してから比較しようとしましたか? '03/00/2011' 文字列を比較しています...概念的に、BETWEEN演算子にとって何を意味するのかわかりません。率直に言って、あなたの結果がまったく意味をなさないことに驚いています!

SQL Server 2008 には、DATEタイムスタンプを除外するネイティブ型があります。タイムスタンプのないネイティブ型 (V9 について言及しました) がない場合は、次のようなものを使用できます。

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, your_date_here))

Anatoly Lubarsky のブログから抜粋:
http://blogs.x2line.com/al/archive/2006/02/17/1458.aspx

于 2011-05-09T16:52:18.293 に答える
0

日時の比較は行われません。比較中はすべてが VARCHAR です。

試す:

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, keyedtimestamp)) as KeyedDate
FROM TMSSTATFILE_STATS a                                                                
WHERE DATEADD(dd, 0, DATEDIFF(dd, 0, keyedtimestamp)) BETWEEN '03/01/2011' AND '03/31/2011'
ORDER BY DATEADD(dd, 0, DATEDIFF(dd, 0, keyedtimestamp))
于 2011-05-09T16:52:34.540 に答える