0

我在 SQL 中使用 datediff。当直接在 sql server 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。
还想指出,如果您希望查询使用索引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)?

于 2012-10-08T09:50:18.333 回答
3

YYYY-MM-DD HH:MM:SS不是用于 SQL Server 中日期时间文字值的安全日期格式。根据SET DATEFORMAT您的月份和日期,部分可能会被切换。

YYYY-MM-DDTHH:MM:SS并且YYYYMMDD 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 回答