2015-04-06 36 views
1

真的很長的故事總結,我有一個表中我有兩個日期時間字段,我加載到變量@DateFrom和@DateTo,我需要「解釋「他們在屏幕上顯示文字的範圍。儘管字段是日期時間,但時間部分將被忽略。我還聲明@Current作爲日期時間來保存getDate()的結果,以防我需要在比較之前剝離時間。T-SQL尋找總結開始和結束日期範圍的最簡潔的方式

由於這種事情不是非常罕見,我希望以前有人做過。

一些例子(我將使用@Current 2015年4月6日,今天的日期):

If @DateFrom is April 6, 2015, and @DateTo is also April 6, 2015, return "Today" 
If @DateFrom is April 5, 2015, and @DateTo is also April 5, 2015, return "Yesterday" 
If @DateFrom is April 2, 2015, and @DateTo is April 6, 2015, return "Last 4 days" 
If @DateFrom is March 29, 2015, and @DateTo is April 4, 2015, return "Last week" 
    (March 29 is Sunday, and April 4 is Saturday). 
If @DateFrom is April 1, 2015, and @DateTo is April 30, 2015, return "This month" 
If @DateFrom is March 1, 2015, and @DateTo is March 31, 2015, return "Last month" 
If @DateFrom is March 28, 2015, and @DateTo is April 5, 2015, 
    return "From March 28, 2015 To April 5, 2015" 
    (because it doesn't fit any of the standard date ranges). 

我希望有人公佈了一個函數的代碼或存儲過程做到這一點還是非常相似的地方,所以我不必重新發明輪子。

+0

爲什麼'@ Current'只是'DATE',因爲「時間分量將被忽略」? –

+0

好點,無論如何使最終的代碼儘可能乾淨和容易。 – Dan

回答

1

一點點醜但可能是最好的T-SQL可以這樣做:

DECLARE @DateFrom DATE, @DateTo DATE 
DECLARE @Current DATE = GETDATE() 

DECLARE @BeginningOfLastWeek DATE = DATEADD(WEEK, DATEDIFF(WEEK,0,GETDATE())-1,-1) 
DECLARE @EndOfLastWeek DATE = DATEADD(DAY, 6, @BeginningOfLastWeek) 

DECLARE @BeginningOfCurrentMonth DATE = DATEADD(MONTH, DATEDIFF(MONTH, 0, @Current), 0) 
DECLARE @EndOfCurrentMonth DATE = DATEADD(DAY, -1, DATEADD(MONTH, 1, @BeginningOfCurrentMonth)) 

DECLARE @BeginningOfLastMonth DATE = DATEADD(MONTH, DATEDIFF(MONTH, 0, @Current)-1, 0) 
DECLARE @EndOfLastMonth DATE = DATEADD(DAY, -1, DATEADD(MONTH, 1, @BeginningOfLastMonth)) 

SELECT 
    CASE 
     WHEN @DateFrom = @Current AND @DateTo = @Current THEN 'Today' 
     WHEN @DateFrom = DATEADD(d, -1, @Current) AND @DateTo = @DateFrom THEN 'Yesterday' 
     WHEN @DateFrom = DATEADD(d, -4, @Current) AND @DateTo = @Current THEN 'Last 4 Days' 
     WHEN @DateFrom = @BeginningOfLastWeek AND @DateTo = @EndOfLastWeek THEN 'Last week' 
     WHEN @DateFrom = @BeginningOfCurrentMonth AND @DateTo = @EndOfCurrentMonth THEN 'This month' 
     WHEN @DateFrom = @BeginningOfLastMonth AND @DateTo = @EndOfLastMonth THEN 'Last month' 
     ELSE 'From ' + CONVERT(nvarchar, @DateFrom, 107) + ' To ' + CONVERT(nvarchar, @DateTo, 107) 
    END 
+0

請參閱下面的完整解決方案。 – Dan

0

我不知道這已經建立了一個函數或存儲過程的,但對皮納爾Dave的網站的東西,你可以複製粘貼,並有80%的功能的準備:http://blog.sqlauthority.com/2008/08/29/sql-server-few-useful-datetime-functions-to-find-specific-dates/

+0

我之前使用Pinal Dave的這段代碼,做的和我在這裏做的完全相反。他的代碼都是關於從合格的日期選擇(即「昨天」)到實際日期值,而我正在採取實際的日期值並儘可能最好地總結它們。 – Dan

0

謝謝,@ thepirat000,我用你的代碼在我的最終解決方案的大頭,我把下面。

SELECT 
    CASE 
     WHEN @DateFrom = @Current AND @DateTo = @Current THEN 'Today' 
     WHEN @DateFrom = DATEADD(d, -1, @Current) AND @DateTo = @DateFrom THEN 'Yesterday' 
     WHEN @DateFrom = @BeginningOfLastWeek AND @DateTo = @EndOfLastWeek THEN 'Last week' 
     WHEN @DateFrom = @BeginningOfCurrentMonth AND @DateTo = @EndOfCurrentMonth THEN 'This month' 
     WHEN @DateFrom = @BeginningOfLastMonth AND @DateTo = @EndOfLastMonth THEN 'Last month' 
     WHEN DATEPART(m,@DateFrom) = DATEPART(m,@DateTo) AND DATEPART(d,@DateFrom) = 1 
      AND DATEPART(d,@DateTo) = datediff(day, dateadd(day, 1-day(@DateFrom), @DateFrom), dateadd(month, 1, dateadd(day, 1-day(@DateFrom), @DateFrom))) 
      THEN DATENAME(MM, @DateFrom) -- the name of the month 
     WHEN DATEPART(dy,@DateFrom) = DATEPART(dy,@DateTo) AND @DateTo = @Current THEN CAST(DATEDIFF(y,@DateFrom,@DateTo) AS varchar(2)) + ' years ago' 
     WHEN DATEPART(d,@DateFrom) = DATEPART(d,@DateTo) AND @DateTo = @Current THEN CAST(DATEDIFF(m,@DateFrom,@DateTo) AS varchar(2)) + ' months ago' 
     WHEN DATEPART(dw,@DateFrom) = DATEPART(dw,@DateTo) AND @DateTo = @Current THEN CAST(DATEDIFF(wk,@DateFrom,@DateTo) AS varchar(2)) + ' weeks ago' 
     WHEN DATEDIFF(dd,@DateFrom,@DateTo) < 30 AND @DateTo = @Current THEN CAST(DATEDIFF(d,@DateFrom,@DateTo) AS varchar(2)) + ' days ago' 
     ELSE 'From ' + CONVERT(nvarchar, @DateFrom, 107) + ' To ' + CONVERT(nvarchar, @DateTo, 107) 
    END 

它不會很好地處理月/月,但它足夠接近我需要做的事情。

+0

如果任何人查看這個解決方案,請將上面的THEN DATENAME(MM,@DateFrom)更改爲'THEN DATENAME(MM,@DateFrom)+''+ DATENAME(YYYY,@DateFrom)'以包含年份這很重要。 – Dan

相關問題