我有一张桌子,从中可以得到特定公司的优惠券。 我的优惠券表如下:
Company_Coupon
我将月份保留为数字(1-12)。
当我更新发票的总优惠券时,我想更新上个月的优惠券。
我通过以下查询来做到这一点:
UPDATE Company_Coupon
SET Total_Coupons = @count
WHERE CompanyID = 1205
AND Month = MONTH(GETDATE())-1 AND Year = YEAR (GETDATE())
我的查询有效,但我注意到这将在2019年1月失效。
如何更新此查询,使其在2019年1月生效?
答案 0 :(得分:2)
请尝试以下情况:
UPDATE Company_Coupon
SET Total_Coupons = @count
WHERE CompanyID = 1205
AND Month = (case when MONTH(GETDATE())-1=0 then 12 else MONTH(GETDATE())-1 end) AND Year = (case when MONTH(GETDATE())-1=0 then YEAR (GETDATE())-1 else YEAR (GETDATE()) end)
答案 1 :(得分:1)
您可以尝试获取1900-01-01
和数据之间的不同数字,然后进行一些计算以获得上个月的数据。
查询1 :
SELECT DATEADD(month, DATEDIFF(month,0,'2019-01-01') - 1, 0)
UNION ALL
SELECT DATEADD(month, DATEDIFF(month,0,'2018-08-01') - 1, 0)
Results :
| |
|----------------------|
| 2018-12-01T00:00:00Z |
| 2018-07-01T00:00:00Z |
因此您可以查询
UPDATE Company_Coupon
SET Total_Coupons = @count
WHERE
CompanyID = 1205
AND
Month = MONTH(DATEADD(month, DATEDIFF(month,0,GETDATE()) - 1, 0))
AND
Year = YEAR (DATEADD(month, DATEDIFF(month,0,GETDATE()) - 1, 0))
答案 2 :(得分:1)
正如我在评论中说的,我希望有一个YearMonth
列,该列具有用于日期时间工作的正确数据类型,但是我们可以在此处执行类似的操作:
UPDATE Company_Coupon
SET Total_Coupons = @count
FROM Company_Coupon
CROSS APPLY (SELECT
DATEADD(month,DATEDIFF(month,'20010201',GETDATE()),'20010101')) t(LastMonth)
WHERE CompanyID = 1205
AND Month = MONTH(LastMonth) AND Year = YEAR(LastMonth)
以上表达式中使用的两个日期无关紧要。真正重要的是它们之间的关系。在这里,第二个日期比第一个日期早一个月,并且该关系通过GETDATE()
/ DATEADD
表达式有效地应用于了DATEDIFF
。这种模式可以多种不同方式使用-例如如果您使用的不是支持EOMONTH
的SQL版本,则可以使用此模式的变体查找3个月前的最后一天。
答案 3 :(得分:0)
如果使用SQL Server 2012或更高版本,则可以使用eomonth()
函数,该函数返回给定日期的上个月的最后一天。从中,您可以提取month()
和year()
部分,并在查询中使用它们:
UPDATE c SET Total_Coupons = @count
from dbo.Company_Coupon c
WHERE c.CompanyID = 1205
AND c.Month = MONTH(eomonth(GETDATE()))
AND c.Year = YEAR(eomonth(GETDATE()));