我正在尝试为从表中选取的用户ID授予和撤消服务器角色。
每当到期日期临近时,我使用以下查询将主表中的行插入到另一个表中,但是该命令不会将任何行插入到从表中。
Insert into tbl2(userid, role, startdate, expirydate)
Select userid, role, startdate, expirydate
from tbl1
where expirydate = Dateadd(day,0, getdate())
如果我使用<=
或>=
,则上述查询有效,但如果tbl1
中有多行,则无效。
答案 0 :(得分:2)
这是因为GETDATE()
会返回DATETIME
值,您可能会将其与DATE
进行比较,因此您可以有效地比较这样的值:
SELECT GETDATE() AS DateTimeValue,
CAST(GETDATE() AS DATE) DateValue;
<强>输出:强>
DateTimeValue DateValue
2017-10-04 10:34:35.023 2017-10-04
默认情况下,如果与DATE
进行比较,则DATETIME
的时间设置为午夜,例如:2017-10-04 00:00:00.000
。
这些值不会与所包含的时间相等,因此请使用CAST
或CONVERT
无时间地获得DATE
:
where expirydate = Dateadd(day,0, CAST(GETDATE() AS DATE))
虽然看起来你不需要Dateadd
子句上的WHERE
,所以删除它除非这是编辑/示例代码。所以也许可以编辑它:
where expirydate = CAST(GETDATE() AS DATE)
<强>参考强>
将当前数据库系统时间戳记作为没有数据库时区偏移量的日期时间值返回。此值派生自运行SQL Server实例的计算机的操作系统。