0

SQLでdatediffを使用しています。SQLサーバー2008で直接実行するとレコードが返されますが、ODBCを介して実行しようとするとエラーは発生しませんが、行は返されません。

SELECT  mc_id, mc_date_entered,
 COUNT([mv_value]) total
FROM MarkbookValue t1
    RIGHT JOIN MarkbookColumn t2 ON t1.mv_column_id = t2.mc_id
WHERE mc_module_id = '703000026609358' 
    AND DateDiff(dd, mc_date_entered, '2012-10-05 20:00:00') = 0
    AND mc_type = 'KEF'
    AND mc_entered_by = 'A.ADMIN'
GROUP BY
    mc_id, mc_date_entered;

DateDiff を取り除くと、関数が正しく実行されますが、明らかにそこに入れたいと思います。私は何を間違っていますか?

4

2 に答える 2

3

私はほとんどの場合、日付を ISO-8601 形式で書きます。ダッシュのない形式は YYYYMMDD です。クエリでインデックスを使用し、 SARGABLEのままにしたい場合は、次のように書き直す必要
があることも指摘したいと思います。mc_date_entered

SELECT  mc_id, mc_date_entered, COUNT([mv_value]) total
FROM MarkbookValue t1
RIGHT JOIN MarkbookColumn t2 ON t1.mv_column_id = t2.mc_id
WHERE mc_module_id = '703000026609358' 
    AND mc_date_entered >= '20121005'
    AND mc_date_entered <  '20121006'
    AND mc_type = 'KEF'
    AND mc_entered_by = 'A.ADMIN'
GROUP BY
    mc_id, mc_date_entered;

また、 DATEDIFF(DDは日付部分のみを考慮するため、時刻を含める意味がないことも認識しています(まだ DATEDIFF を使用している場合)。

于 2012-10-08T09:50:18.333 に答える
3

YYYY-MM-DD HH:MM:SSは、SQL Server で日時リテラル値に使用する安全な日付形式ではありません。ご利用の月と日の部分によってはSET DATEFORMAT入れ替わる場合があります。

YYYY-MM-DDTHH:MM:SSYYYYMMDD HH:MM:SS関係なく安全に使用できますSET DATEFORMAT

特定の日付の行を取得するには、@RichardTheKiwiが提供する回答のようにするか、SQL Server 2008 を使用している場合は、列を日付にキャストして時間部分を削除することをお勧めします。

where cast(mc_date_entered as date) = '2012-10-05'

YYYY-MM-DD データ型に対して安全ですdate

于 2012-10-08T11:01:00.057 に答える