打破这个简单的SQL / HQL查询 - DATEADD,DATEDIFF?

时间:2014-03-27 18:55:14

标签: sql hql

select * from table
where Date BETWEEN DATEADD(dd, DATEDIFF(dd, 84, GETDATE()),0)
and DATEADD(dd, DATEDIFF(dd, 77, GETDATE()),0)

有人可以解释这个查询在做什么吗?具体来说,此查询中DATEADDDATEDIFF的功能是什么?

2 个答案:

答案 0 :(得分:1)

您的表达式使用SQL Server语法将日期时间转换为日期(即删除日期组件。格式非常晦涩,因为表达式将getdate() - 84作为整数进行,然后添加此到0日期。由于datediff()返回一个整数,因此消除了“时间”组件。

我认为这不适用于HQL。例如,dd应为'dd',HQL有不同的获取当前日期的方法。

而且,在更新版本的SQL Server中,您只需执行cast(getdate() - 84 as date)

答案 1 :(得分:1)

他们试图在84到77天之间重新获得会​​员资格,从而剥夺了时间。

GETDATE()返回日期时间,但用户对时间不感兴趣。

DATEDIFF(dd,84,GETDATE())获取当前日期与1900年1月1日之后的第84天之间的天数。

DATEADD(dd,#from from above,0)将这些天数添加到1900年1月1日。

你可以在84天前的00:00:00收到网。

如果你刚刚做了DATEADD(dd,-84,GETDATE())那么你有84天前+当前时间。

执行相同操作的其他方法是将日期时间转换为日期(假设MS SQL Server)。

.. CAST((GETDATE() - 84) AS DATE)
.. CAST(DATEADD(day, -84, GETDATE()) as DATE)