2012-10-08 50 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