2014-06-25 48 views
0

我有一个按钮,当我们进入新月时,它会在前一个月被锁定。SQL-特别DATEDIFF条件

例如,如果今天的日期是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日,该按钮应该是上个月可见(可以如每例)

是否与SQL查询的帮助下做到这一点

感谢任何有效的方法

回答

2

逻辑我会使用是一样的东西

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 
+0

非常感谢老兄!它像一个魅力工作! –

0
Select save_visible = case when 
    datepart(mm,datefin) = month(getdate()) or datepart(dd,datefin)<=7 then 1 
    else o end 
+1

似乎并不是在所有的工作。这将使'datefin'包含1-7天之间符合保存条件的任何行,而不是基于当前日期的条件。即使你在最后的比较中用'getdate()'代替了'datefin'(我认为这与OPs的要求更接近),这就意味着,在任何一个月的前7天内,* all * rows都符合为了节省,无论他们来自哪个月。 –

+0

如果可能,直到6月7日它应该在五月份可见是ri8? – Azar

+0

它不工作。当月份相同或者日期在前一个月的前7天内(不是必需的)时,它的制作标记为真 –