2014-06-25 100 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天內(不是必需的)時,它的製作標記爲真 –