我目前有一个sql存储过程,可在6个月后自动关闭打开的票证。类似于以下内容
UPDATE TABLE.TICKETS
SET STATUS = 'Closed'
WHERE DateAdd(MM,6,OPENED_DATE) < GETDATE()
只要opens_date恰好是6个月或更长时间,就会将状态设置为关闭状态。
我需要它做的是计算整个月。例如
如果开放日期是05/05/2010,我不希望它在2010年11月5日关闭(目前正好6个月 - 我现在希望它在月末关闭距离酒店有6个月的时间。即05/05/2010的机票将于2010年12月1日截止。2010年5月15日提交的机票也将于2010年12月1日截止。
有人可以建议最好的方法吗?我的想法是空白:(。谢谢
答案 0 :(得分:2)
这个怎么样:
UPDATE TABLE.TICKETS
SET STATUS = 'Closed'
WHERE OPENED_DATE < dateadd(mm, -6, GETDATE() - day(getdate) + 1)
day()
函数返回月中的某一天,因此表达式GETDATE() - day(getdate) + 1
将返回当月的第一天。其余的减去六个月并将其与OPENED_DATE
进行比较。
请注意,我将逻辑从列切换到“常量”。这允许SQL Server在OPENED_DATE
上使用索引(如果有的话)(技术术语是“sargability”)。
答案 1 :(得分:0)
检查今天OPEN_DATE月份的最后一天:
UPDATE TABLE.TICKETS
SET STATUS = 'Closed'
WHERE DateAdd(MM,6,DATEDIFF(m,0,OPENED_DATE)+1,0))) < GETDATE()