2017-03-07 65 views
0

我使用的是SQL Server 2008 R2和需要通過選擇開始和結束日期與月份的最後一天返回的所有數據:如何獲得一個月(SQL Server)的最後一天

當用戶選擇兩個日期是這樣的:

開始日期:2017-01-01

結束日期:2017-22-02

結果必須是: 2017-31-012017-22-02

我嘗試下面的代碼,但我得到了錯誤的結果=>2017-28-02

SELECT 
    DATEADD(d, -1, DATEADD(mm, DATEDIFF(m, 0,'2017-22-02') + 1, 0)) AS DiffDate, 
    MEMBER_ID 
FROM 
    dbo.tblOne 
WHERE 
    DATUM >= '2017-01-01' 
AND 
    DATUM <= '2017-22-02' 

任何人都可以有一個想法是什麼,我做錯了?

編輯: 我希望以下結果:

DiffDate | MemberID | ... 
--------------------------------- 
    2017-01-31 | CBK01 
    2017-01-31 | KKM05 
    2017-01-31 | ABC99 
    2017-02-22 | CBK01 
    2017-02-22 | KKM05 
    2017-02-22 | ABC99 
+0

@AndrewMorton通常我總是使用這種格式'YYYY-MM-dd'但今天的SQL Server管理工作室只接受'yyyy-dd-MM' ......我不知道爲什麼。 – yuro

+0

@AndrewMorton - 我們自己的,根據SQL Server開發人員的智慧 - 如果你設置了dateformat dmy或set language british_english,那麼你會發現它也顛倒了它接受'nnnn-nn-nn'格式。這就是爲什麼爲了安全起見,你應該使用'yyyyMMdd',也就是說,不要使用分隔符(如果你有時間的話可以使用'yyyy-MM-ddThh:mm:ss') - SQL Server不會出錯。 –

+0

我完全不清楚你在這裏要做什麼 - 可能會添加一些*樣本數據*和*預期結果*。你的敘述難以遵循。 –

回答

0

我使用UDF fn_DateSerial來簡化這些日期的操作:

--sample value 
Declare @Startdate datetime 
set @Startdate = GetDate() 

--last day of month 
select DateAdd(month, 1, dbo.fn_DateSerial(Year(@Startdate),Month(@Startdate),1,0,0,0,0)) - 1 

所以基本上我條紋日部分(使其第一天),然後添加1個月,最後減去一天。

這個UDF的靈感來自同名vb6函數。

/* 
Function composes datetime from its parts - year, month, day, minute, etc. 
*/ 
CREATE FUNCTION dbo.fn_DateSerial(@year int, @month int, @day int, @hour int, @minute int, @second int, @millisecond int) RETURNS datetime 
BEGIN 
    DECLARE @dt datetime, @dtStr varchar(255) 
    --mm/dd/yyyy hh:mi:ss.mmm(24h) 
    SET @dtStr = '' 
    SET @dtStr = @dtStr + right('00'+convert(varchar(2), @month),2) + '/' 
    SET @dtStr = @dtStr + right('00'+convert(varchar(2), @day),2) + '/' 
    SET @dtStr = @dtStr + right('0000'+convert(varchar(4),@year),4) 

    SET @dtStr = @dtStr + ' ' + right('00'+convert(varchar(2), @hour),2) + ':' 
    SET @dtStr = @dtStr + right('00'+convert(varchar(2), @minute),2) + ':' 
    SET @dtStr = @dtStr + right('00'+convert(varchar(2), @second),2) + '.' 
    SET @dtStr = @dtStr + right('000'+convert(varchar(3), @millisecond),3) 

    SET @dt = CONVERT(datetime, @dtStr, 101) 

    return @dt 
END 
+0

感謝您的回答,但這太複雜了。有一個更聰明的解決方案。 – yuro

+0

然後'選擇DATEADD(month,DATEDIFF(month,0,@ Startdate)+1,0) - 1'是要走的路。這與您輸入的內容完全相同,並且工作正常。如果它不適合你 - 在其他地方(不包括日期)出現問題。 –

0

離開解決方案的日期格式在這裏,但這是你真正需要解決的問題。據我所知,你只需要找到給定日期前一個月的最後一天。這將使用getdate()作爲基礎。您可以輕鬆地將getdate()更改爲數據中的一列。

select LastDayOfPreviousMonth = dateadd(day, -1, dateadd(month, datediff(month, 0, GETDATE()), 0)) 
0

我可以建議此方法來獲取一個月的日期的最後日期:

declare @date datetime = '2017-04-22'; 

select 
    dateadd(d, 
     -datepart(d,@date) -- count of days of @date to get back 
     ,dateadd(m,1,@date) -- get date of next month of @date 
    ) lastDate 
相關問題