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

时间:2017-03-07 14:22:59

标签: sql sql-server sql-server-2008-r2

我使用的是SQL Server 2008 R2,需要通过选定的开始和结束日期返回月中最后一天的所有数据:

当用户选择两个日期时:

开始日期: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

3 个答案:

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