【问题标题】:SQL- Special DATEDIFF conditionSQL - 特殊 DATEDIFF 条件
【发布时间】:2014-06-25 09:04:17
【问题描述】:

我有一个按钮,当我们进入新月份时,该按钮会锁定上个月。

例如。如果今天的日期是 04-06-2014,则该按钮仅在本月可见。上个月(本例中为 5 月)将不可见。

为此,我使用 sql 查询作为 -

select save_visible = case when datediff(month,datefin,getdate())>=1 then cast(0 as bit)   else cast(1 as bit) end

它运行良好。 但现在我想保持该按钮在上个月可见,直到本月的前 7 天。

即在 2014 年 7 月 6 日之前,该按钮应该在上个月可见(根据示例可能是 5 月)

有没有什么有效的方法可以借助 SQL 查询来做到这一点

谢谢

【问题讨论】:

    标签: sql sql-server-2008 datediff


    【解决方案1】:

    我会采用的逻辑类似于

    WHEN DateFin > CASE WHEN [Today is after the 7th] THEN [1st of This Month]
                        ELSE [First of Last Month]
                    END
        THEN 1 
        ELSE 0 
    END
    

    因此,需要解决的部分是找到合适的日期进行比较。最简单的方法是获取本月的第一天,即 7 天前的那一天。获取当月 1 日的标准逻辑是:

    SELECT  DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101')
    

    或者,如果您更喜欢更短的方法,您可以依赖将 int 隐式转换为日期:

    SELECT  DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)
    

    然后将这个逻辑应用到 7 天前:

    SELECT  DATEADD(MONTH, DATEDIFF(MONTH, '19000101', DATEADD(DAY, -7, GETDATE())), '19000101')
    

    发表完整声明:

    save_visible = CASE WHEN DateFin >= DATEADD(MONTH, DATEDIFF(MONTH, '19000101', DATEADD(DAY, -7, GETDATE())), '19000101')
                        THEN CAST(1 AS BIT)
                        ELSE CAST(0 AS BIT)
                    END
    

    这里是这个逻辑的快速测试

    SELECT  Today = d.Date,
            CutOffDate = CAST(DATEADD(MONTH, DATEDIFF(MONTH, '19000101', DATEADD(DAY, -7, d.Date)), '19000101') AS DATE)
    FROM    (   SELECT  Date = CAST(DATEADD(DAY, - Number, '20140610') AS DATE)
                FROM    master..spt_values 
                WHERE   [Type] = 'P'
                AND     Number BETWEEN 0 AND 50
            ) AS d
    

    给予

    Today       CutOffDate
    2014-06-09  2014-06-01
    2014-06-08  2014-06-01
    2014-06-07  2014-05-01
    2014-06-06  2014-05-01
    ....
    2014-05-08  2014-05-01
    2014-05-07  2014-04-01
    2014-05-06  2014-04-01
    2014-05-05  2014-04-01
    

    【讨论】:

      【解决方案2】:
      Select save_visible = case when 
        datepart(mm,datefin) = month(getdate()) or datepart(dd,datefin)<=7 then 1 
        else o end
      

      【讨论】:

      • 这似乎根本不起作用。这将使datefin 包含介于 1-7 之间的一天的任何行都符合保存条件,而不是基于当前日期的条件。即使您在最终比较中用 getdate() 替换 datefin(我认为这更接近 OPs 要求),这也意味着在任何一个月的前 7 天,all行有资格保存,无论它们来自哪个月份。
      • 如果是 5 月,到 6 月 7 日应该可以在 5 月看到是 ri8 吗?
      • 它不工作。当月份相同或日期在任何前一个月的前 7 天内(这不是要求)时,它的标记为真
      • 您能否详细说明要求,如果您希望显示截至 6 月 7 日的日期,可以吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 2017-03-27
      • 2015-05-23
      • 1970-01-01
      相关资源
      最近更新 更多