获取上个月的数字,包括年份

时间:2018-09-06 07:43:39

标签: sql sql-server datetime

我有一张桌子,从中可以得到特定公司的优惠券。 我的优惠券表如下:

Company_Coupon

  • ID
  • CompanyID
  • 总优惠券
  • 年份

我将月份保留为数字(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月生效?

4 个答案:

答案 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()));