代码之家  ›  专栏  ›  技术社区  ›  Byron Whitlock

在SQL中获取每月的最后一天

  •  39
  • Byron Whitlock  · 技术社区  · 16 年前

    我需要得到一个月的最后一天作为SQL中的一个日期。如果我有一个月的第一天,我可以这样做:

    DATEADD(DAY, DATEADD(MONTH,'2009-05-01',1), -1)
    

    但是有人知道如何概括它,这样我就可以找到任何给定日期的月的最后一天了吗?

    20 回复  |  直到 6 年前
        1
  •  54
  •   LukeH    16 年前

    这是我的版本。不需要字符串操作或强制转换,只需对 DATEADD , YEAR MONTH 功能:

    DECLARE @test DATETIME
    SET @test = GETDATE()  -- or any other date
    
    SELECT DATEADD(month, ((YEAR(@test) - 1900) * 12) + MONTH(@test), -1)
    
        2
  •  51
  •   Martin Smith    7 年前

    从SQL Server 2012可以使用 EOMONTH 功能。

    返回包含指定日期的月份的最后一天, 带可选偏移。

    句法

    EOMONTH ( start_date [, month_to_add ] ) 
    

    怎样。。。我能找到任何给定日期的月最后一天吗?

    SELECT EOMONTH(@SomeGivenDate)
    
        3
  •  13
  •   Eric    16 年前

    您可以使用 DAY() 功能:

    dateadd(day, -1, dateadd(month, 1, dateadd(day, 1 - day(date), date)))
    
        4
  •  4
  •   Goca    11 年前

    我知道这是一个古老的问题,但这里有另一个适合我的解决方案

    SET @dtDate = "your date"
    DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@dtDate)+1,0))
    

    如果有人在寻找不同的例子,这里有一个链接 http://blog.sqlauthority.com/2007/08/18/sql-server-find-last-day-of-any-month-current-previous-next/

    我希望这对其他人有帮助。 堆满石头!!!!!

        5
  •  3
  •   marc_s    9 年前

    根据声明:

    SELECT DATEADD(MONTH, 1, @x)           -- Add a month to the supplied date @x
    

    SELECT DATEADD(DAY,  0 - DAY(@x), @x)  -- Get last day of month previous to the supplied date @x
    

    将一个月添加到date@x,然后检索该日期前一个月的最后一天(即提供日期的该月的最后一天)怎么样?

    DECLARE @x  DATE = '20-Feb-2012' 
    SELECT DAY(DATEADD(DAY,  0 - DAY(DATEADD(MONTH, 1, @x)), DATEADD(MONTH, 1, @x)))
    

    注意:这是使用SQL Server 2008 R2进行的测试

        6
  •  2
  •   Eric    16 年前

    只要把你的公式稍微扩展一点:

    dateadd(day, -1,
        dateadd(month, 1,
            cast(month('5/15/2009') as varchar(2)) + 
            '/1/' + 
            cast(year('5/15/2009') as varchar(4)))
    
        7
  •  2
  •   Satinder singh Arun P Johny    8 年前

    用于SQL Server 2012或更高版本 EOMONTH to get the last date of month

    显示当月结束日期的SQL查询

    DECLARE @currentDate DATE = GETDATE()
    SELECT EOMONTH (@currentDate) AS CurrentMonthED
    

    显示下个月结束日期的SQL查询

    DECLARE @currentDate DATE = GETDATE()
    SELECT EOMONTH (@currentDate, 1 ) AS NextMonthED
    
        8
  •  1
  •   marc_s    9 年前

    使用SQL Server,以下是查找每月最后一天的另一种方法:

    SELECT DATEADD(MONTH,1,GETDATE())- day(DATEADD(MONTH,1,GETDATE()))
    
        9
  •  1
  •   David    8 年前

    winsql获取上个月的最后一天(即今天是2017-02-09,返回2017-01-31: 选择日期添加(day,-day(today()),today())

        10
  •  1
  •   LONG    8 年前

    尝试运行以下查询,它将为您提供所需的一切:)

    Declare @a date =dateadd(mm, Datediff(mm,0,getdate()),0)
    Print('First day of Current Month:')
    Print(@a)
    Print('')
    set @a = dateadd(mm, Datediff(mm,0,getdate())+1,-1)
    Print('Last day of Current Month:')
    Print(@a)
    Print('')
    
    Print('First day of Last Month:')
    set @a = dateadd(mm, Datediff(mm,0,getdate())-1,0)
    Print(@a)
    Print('')
    
    Print('Last day of Last Month:') 
    set @a = dateadd(mm, Datediff(mm,0,getdate()),-1)
    Print(@a)
    Print('')
    
    
    Print('First day of Current Week:')
    set @a = dateadd(ww, Datediff(ww,0,getdate()),0)
    Print(@a)
    Print('')
    
    Print('Last day of Current Week:')
    set @a = dateadd(ww, Datediff(ww,0,getdate())+1,-1)
    Print(@a)
    Print('')
    
    Print('First day of Last Week:')
    set @a =  dateadd(ww, Datediff(ww,0,getdate())-1,0)
    Print(@a)
    Print('')
    
    Print('Last day of Last Week:')
    set @a =  dateadd(ww, Datediff(ww,0,getdate()),-1)
    Print(@a)
    
        11
  •  1
  •   Dan Lowe    8 年前

    我想返回上个月的所有记录:

    where DATE01 between dateadd(month,-1,dateadd(day,1,dateadd(day,-day(today()),today()))) and dateadd(day,-day(today()),today())
    

    这是同样的事情:

    where month(DATE01) = month(dateadd(month,-1,today())) and year(DATE01) = year(dateadd(month,-1,today()))
    
        12
  •  1
  •   Sri    7 年前

    在SQL Server中工作

    Declare @GivenDate datetime
    SET @GivenDate = GETDATE()
    
    Select DATEADD(MM,DATEDIFF(MM, 0, @GivenDate),0) --First day of the month 
    
    Select DATEADD(MM,DATEDIFF(MM, -1, @GivenDate),-1) --Last day of the month
    
        13
  •  0
  •   Raj    16 年前

    我的2分钱:

    select DATEADD(DAY,-1,DATEADD(MONTH,1,DATEADD(day,(0-(DATEPART(dd,'2008-02-12')-1)),'2008-02-12')))
    

    拉吉

        14
  •  0
  •   A-K    16 年前

    如果您经常需要它,请将它包装在一个内嵌的TVF中,这是非常快的:

    http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/06/21/calculating-third-wednesday-of-the-month-with-inline-udfs.aspx ,

        15
  •  0
  •   Peter Perháč    12 年前

    使用SQL Server 2005,这对我很有用:

    select dateadd(dd,-1,dateadd(mm,datediff(mm,0,YOUR_DATE)+1,0))
    

    基本上,您可以从(SQL Server)开始日期的月数。然后再加一个,得到下个月的序列号。然后将这个月数加为0,得到下个月的第一天的日期。从中减去一天,得出你约会的最后一天。

        16
  •  0
  •   nstCactus    11 年前

    这适用于我,使用Microsoft SQL Server 2005:

    DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,'2009-05-01')+1,0))
    
        17
  •  0
  •   peter.petrov    11 年前

    以某个月的31日为基准日,例如“20011231”。然后使用
    以下步骤(我在下面给出了3个相同的示例,只有@dt值不同)。

    declare @dt datetime;
    
    set @dt = '20140312'
    
    SELECT DATEADD(month, DATEDIFF(month, '20011231', @dt), '20011231');
    
    
    
    set @dt = '20140208'
    
    SELECT DATEADD(month, DATEDIFF(month, '20011231', @dt), '20011231');
    
    
    
    set @dt = '20140405'
    
    SELECT DATEADD(month, DATEDIFF(month, '20011231', @dt), '20011231');
    
        18
  •  0
  •   Başar Kaya    7 年前

    我写了以下函数,它工作。

    它返回日期时间数据类型。零小时,分,秒,毫秒。

    CREATE Function [dbo].[fn_GetLastDate]
    (
        @date datetime
    )
    returns datetime
    as
    begin
    
    declare @result datetime
    
     select @result = CHOOSE(month(@date),  
     DATEADD(DAY, 31 -day(@date), @date),
     IIF(YEAR(@date) % 4 = 0, DATEADD(DAY, 29 -day(@date), @date), DATEADD(DAY, 28 -day(@date), @date)), 
     DATEADD(DAY, 31 -day(@date), @date) ,
     DATEADD(DAY, 30 -day(@date), @date), 
     DATEADD(DAY, 31 -day(@date), @date),
     DATEADD(DAY, 30 -day(@date), @date), 
     DATEADD(DAY, 31 -day(@date), @date),
     DATEADD(DAY, 31 -day(@date), @date),
     DATEADD(DAY, 30 -day(@date), @date),
     DATEADD(DAY, 31 -day(@date), @date),
     DATEADD(DAY, 30 -day(@date), @date), 
     DATEADD(DAY, 31 -day(@date), @date))
    
     return convert(date, @result)
    
    end
    

    它很容易使用。 2个例子:

    select [dbo].[fn_GetLastDate]('2016-02-03 12:34:12')
    
    select [dbo].[fn_GetLastDate](GETDATE())
    
        19
  •  0
  •   Serkan Arslan    6 年前

    也可以使用此查询。

    DECLARE @SelectedDate DATE =  GETDATE()
    
    SELECT DATEADD(DAY, - DAY(@SelectedDate), DATEADD(MONTH, 1 , @SelectedDate)) EndOfMonth
    
        20
  •  -1
  •   Nathan Champion    6 年前
    ---Start/End of previous Month 
    Declare @StartDate datetime, @EndDate datetime
    
    set @StartDate = DATEADD(month, DATEDIFF(month, 0, GETDATE())-1,0) 
    set @EndDate = EOMONTH (DATEADD(month, DATEDIFF(month, 0, GETDATE())-1,0)) 
    
    SELECT @StartDate,@EndDate