【问题标题】:DateDiff in SQL ODBCSQL ODBC 中的 DateDiff
【发布时间】:2012-10-08 09:42:35
【问题描述】:

我在 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 可以让函数正确运行,但我显然希望把它放在那里。我做错了什么?

【问题讨论】:

  • 可能是您的日期格式的解释不同。试试'2012-10-05T20:00:00'
  • “T”解决了它。想添加这个作为答案,我会接受它

标签: sql sql-server-2008 odbc datediff


【解决方案1】:

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 而言是安全的。

【讨论】:

【解决方案2】:

我几乎总是以 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)?

【讨论】:

  • 感谢您指出 dd 问题。我一直在 dd 和 minute 之间切换,并且 dd 滑过。它真的应该读分钟。
  • 如果您希望查询执行良好,您仍然需要在mc_date_entered 上建立索引,并将条件更改为AND mc_date_entered &gt;= '2012-10-05 20:00:00' AND mc_date_entered &lt; DATEADD(mm,1,'2012-10-05 20:00:00'),假设 datetime 来自一些参数。
  • 谢谢理查德,我正在实施这个,我想接受这两个答案,但不幸的是它不允许这样做。没有不尊重您的回答,但另一个更接近我的问题。
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多