2014-06-27 72 views
0

我需要爲我的帳戶團隊創建一個視圖,以通過Excel顯示老年債務人。使用案例,然後過濾日期

我已收到所有未付發票的截止日期,我想要實現30,60,90和120天的細分。

我現在的劇本是這樣的......

CASE WHEN ST_TRANSMONTH = MONTH(GETDATE()) 
    then '30 Days' 
    else if ST_TRANSMONTH = MONTH(GETDATE()) + 30 = '60 DAYS' and so on. 

我不能GE這個工作,雖然,幫助將不勝感激!

+0

請發佈您的數據庫架構,一些示例數據和所需的輸出。 – Quassnoi

+0

CASE沒有ELSE IF,它只有多個WHEN(並且可能有一個ELSE) –

+0

只有在當前月份,您纔看起來沒有看到30天? –

回答

0

應該是這樣的:

CASE WHEN ST_TRANSMONTH = MONTH(GETDATE()) THEN '30 Days' 
    WHEN ST_TRANSMONTH = MONTH(GETDATE()) + 1 = '60 DAYS' 
    WHEN ST_TRANSMONTH = MONTH(GETDATE()) + 2 = '90 DAYS' 
END as ColumnName 
+1

我對上述使用月份的原因有所擔憂。並非所有的月份都是30天長,並且使用一個月模糊匹配日期可能會導致問題,包括潛在的法律問題,如果他們繼續收集針對實際上並不晚的人,但似乎在報告中。 –

1

你的數學中有一個細微的瑕疵,在您使用MONTH檢查從交易日日內的長度,但我們知道,並不是所有的月份有30天,因此你會介紹一些地區的差異,如果你發送遲到的通知給他們,當他們技術不晚時,這可能會涉及法律問題。

此外,有人可能會超過30天過期,但你不趕上它,因爲它是一個不同的月份,例如,他們在上個月25日買了東西,現在是本月的31日,他們超過了30天,但您沒有報告。

而不是月,使用DATEDIFF命令,這是TSQL的一部分。它可以讓你得到指定單位的兩個日期之間的差異:

CASE 
    WHEN ST_TRANSMONTH > DATEADD(DD, -30, GETDATE()) THEN '30 Days' 
    WHEN ST_TRANSMONTH > DATEADD(DD, -60, GETDATE()) THEN '60 Days' 
    -- add more cases as needed 
END 

試試看。

祝你好運。

+0

+1:儘管'ST_TRANSMONTH> DATEADD(DD,-30,GETDATE())THEN '30 Days''模式只使用日期函數到標量常量,而不是表格中的每一行。 – MatBailie

+0

真的,很好!我喜歡。 –

+0

@matbailie - 我更新了我的答案以使用您的建議。再次感謝! –

0

你似乎只存儲一個月,而不是一年?那麼你很難檢查兩個日期之間有多少天/月。你應該更好地存儲一個完整的日期(或至少一個月+年)。

如果保存一個完整的日期,你真要查30天的間隔,那麼你可以

select convert(varchar, datediff(day, st_date, getdate())/30*30) + ' days' from mytable 

如果保存一個完整的日期,你只需要檢查一個月的時間間隔,那麼你可以

select convert(varchar, datediff(month, st_date, getdate())/30) + ' days' from mytable