我使用的是SQL Server 2008 R2,需要通过选定的开始和结束日期返回月中最后一天的所有数据:
当用户选择两个日期时:
开始日期:2017-01-01
Enddate:2017-22-02
结果必须是:
2017-31-01
和2017-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 :(得分:2)
我可以建议这种方法来获取一个月的最后一个日期:
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
答案 1 :(得分: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
答案 2 :(得分:0)
将日期格式从解决方案中删除,但这是您真正需要解决的问题。据我所知,您只需要查找给定日期的上个月的最后一天。这将使用getdate()作为基础。您可以轻松地将getdate()更改为数据中的列。
select LastDayOfPreviousMonth = dateadd(day, -1, dateadd(month, datediff(month, 0, GETDATE()), 0))