如何获得一个月的最后一天(SQL Server)



我正在使用SQL Server 2008 R2,并且需要通过选定的启动和终点返回所有数据,请返回所有数据:

用户选择两个日期时,例如:

startDate: 2017-01-01

enddate: 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

我可以建议这种方法来获得日期的最后日期:

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))

最新更新