【问题标题】:Get the previous month number including year获取上个月的数字,包括年份
【发布时间】:2018-09-06 16:00:22
【问题描述】:

我有一张桌子,可以在其中获取特定公司的优惠券。 我的优惠券表是这样的:

Company_Coupon

  • 身份证
  • 公司ID
  • Total_Coupons
  • 年份

我以数字 (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 月生效?

【问题讨论】:

  • 存储单个YearMonth 列可能会更好,键入为date 并具有强制它始终是该月的第一天的约束。这样您就可以使用简单的日期数学函数来计算它。例如。 DATEADD(month,DATEDIFF(month,'20010201',GETDATE()),'20010101') 总是给你上个月的第一天。
  • @Damien_The_Unbeliever 遗憾的是,目前这不是一个选项,因为我使用此表循环遍历行并使用不同的算法对其进行操作

标签: sql sql-server datetime


【解决方案1】:

尝试以下情况:

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)

【讨论】:

  • 遗憾的是,当我将 GETDATE() 设置为 2019-01-01 时,这不会返回 2018 年 12 月的那些
  • 修改了答案..现在检查
【解决方案2】:

你可以尝试在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)) 

【讨论】:

    【解决方案3】:

    正如我在评论中所说,我希望有一个具有正确数据类型的 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) 
    

    上述表达式中使用的两个日期无关紧要。真正重要的是它们之间的关系。在这里,第二个日期比第一个日期早一个月,它是通过DATEADD/DATEDIFF 表达式有效应用于GETDATE() 的关系。这是一种可以以多种不同方式使用的模式 - 例如如果您使用的 SQL 版本不支持 EOMONTH,则可以使用此模式的变体来查找 3 个月前的最后一天。

    【讨论】:

      【解决方案4】:

      如果您使用 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()));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多