2012-10-08 84 views
0

我在SQL中使用datediff。它直接在sql server 2008中運行時會返回記錄,但是當我嘗試通過ODBC運行它時,它不會引發錯誤,但它不返回任何行。SQL中的DateDiff 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讓函數可以正常運行,但我顯然希望它在那裏。我究竟做錯了什麼?

+0

它可能是你的日期格式不同的解釋。試試''2012-10-05T20:00:00''' –

+0

'T'解決了它。幻想添加此作爲答案,我會接受它 – pluke

回答

2

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

+0

不知道'YYYY-MM-DD'可以安全的使用'date',謝謝。 –

+1

@AndriyM - 感謝您的編輯。 [YYYY-MM-DD HH:MM:SS對於datetime2也是安全的](http://connect.microsoft.com/SQLServer/feedback/details/290971/deprecate-the-date-literal-interpretation-yyyy-dd- MM-除了合兼容性模式-90) –

3

我幾乎總是寫在日期ISO-8601格式,在一個沒有破折號是年月日。
只是想也指出,如果你希望你的查詢,以便對mc_date_entered使用索引並保持SARGABLE,你要重寫它這樣。

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)?

+0

感謝您指出dd問題。我一直在dd和minute之間切換,而dd則通過了。它應該真的讀一分鐘。 – pluke

+0

如果您希望查詢性能良好,您仍然需要'mc_date_entered'上的索引,並將您的條件更改爲AND AND mc_date_entered> ='2012-10-05 20:00:00'AND mc_date_entered RichardTheKiwi

+0

感謝理查德我正在實施這個,我想接受這兩個答案,但不幸的是,它不允許。沒有不尊重你的答案,但另一個更接近我的問題。 – pluke