SQL Server 2005 Get First and Last date for any Month in any Year

后端 未结 9 931
忘了有多久
忘了有多久 2020-12-30 08:29

I have a stored procedure that has to accept a month as int (1-12) and a year as int. Given those two values, I have to determine the date range of that month. So I need a d

相关标签:
9条回答
  • 2020-12-30 09:03

    Try this:

    Declare @month int, @year int;
    Declare @first DateTime, @last DateTime;
    Set @month=10;
    Set @year=2010;
    Set @first=CAST(CAST(@year AS varchar) + '-' + CAST(@month AS varchar) + '-' + '1' AS DATETIME);
    Set @last=DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@first)+1,0));
    
    SELECT @first,@last;
    
    0 讨论(0)
  • 2020-12-30 09:10
    DECLARE @Month int;
    DECLARE @Year int;
    DECLARE @FirstDayOfMonth DateTime;
    DECLARE @LastDayOfMonth DateTime;
    
    SET @Month = 3
    SET @Year = 2010
    
    SET @FirstDayOfMonth = CONVERT(datetime, CAST(@Month as varchar) + '/01/' + CAST(@Year as varchar));
    SET @LastDayOfMonth = DATEADD(month, 1, CONVERT(datetime, CAST(@Month as varchar)+ '/01/' + CAST(@Year as varchar))) - 1;
    
    0 讨论(0)
  • 2020-12-30 09:11

    First day of the month: SELECT DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0)

    Last day of the month: SELECT DATEADD(ms, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()) + 1, 0))

    Substitute a DateTime variable value for GETDATE().

    I got that long ago from this very handy page which has a whole bunch of other date calculations, such as "Monday of the current week" and "first Monday of the month".

    0 讨论(0)
  • 2020-12-30 09:16
    DECLARE @Month int
    DECLARE @Year int
    
    set @Month = 2
    set @Year = 2004
    
    select DATEADD(month,@Month-1,DATEADD(year,@Year-1900,0)) /*First*/
    
    select DATEADD(day,-1,DATEADD(month,@Month,DATEADD(year,@Year-1900,0))) /*Last*/
    

    But what do you need as time component for last day of the month? If your datetimes have time components other than midnight you may well be better off just doing something like

    WHERE COL >= DATEADD(month,@Month-1,DATEADD(year,@Year-1900,0)) 
         AND COL < DATEADD(month,@Month,DATEADD(year,@Year-1900,0)) 
    

    In this way your code will continue to work if you eventually migrate to SQL Server 2008 and the greater precision datetime datatypes.

    0 讨论(0)
  • 2020-12-30 09:22

    You can use DATEFROMPARTS to declare the first day of the month and EOMONTH to derive the last date of the month from the first date.

    DECLARE @Month INT = 1
    DECLARE @Year INT = 2020
    
    DECLARE @FromDate DATE = DATEFROMPARTS(@Year, @Month, 1)
    DECLARE @ToDate DATE = EOMONTH(@FromDate)
    
    SELECT @FromDate MonthFirstDate, @ToDate MonthLastDate
    
    0 讨论(0)
  • 2020-12-30 09:24
    DECLARE @Month INTEGER
    DECLARE @Year INTEGER
    SET @Month = 10
    SET @Year = 2010
    
    DECLARE @FirstDayOfMonth DATETIME
    DECLARE @LastDayOfMonth DATETIME
    
    SET @FirstDayOfMonth = Str(@Year) + RIGHT('0' + Str(@Month), 2) + '01'
    SET @LastDayOfMonth = DATEADD(dd, -1, DATEADD(mm, 1, @FirstDayOfMOnth))
    SELECT @FirstDayOfMonth, @LastDayOfMonth
    
    0 讨论(0)
提交回复
热议问题