我正在使用SQL Server 2008 R2,并且需要通过选定的启动和终点返回所有数据,请返回所有数据:
用户选择两个日期时,例如:
startDate: 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
我可以建议这种方法来获得日期的最后日期:
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
我正在使用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
在此处将日期格式排除在解决方案之外,但这是您真正需要解决的问题。据我了解,您只需要在给定日期找到上个月的最后一天即可。这将使用getDate()作为基础来做到这一点。您可以轻松地更改GetDate()为数据中的列。
select LastDayOfPreviousMonth = dateadd(day, -1, dateadd(month, datediff(month, 0, GETDATE()), 0))