【问题标题】:SQL Server 2005 Get First and Last date for any Month in any YearSQL Server 2005 获取任何一年中任何月份的第一个和最后一个日期
【发布时间】:2011-04-24 09:40:38
【问题描述】:

我有一个存储过程,它必须接受一个月作为 int (1-12) 和一年作为 int。鉴于这两个值,我必须确定该月的日期范围。所以我需要一个 datetime 变量来表示该月的第一天,另一个 datetime 变量来表示该月的最后一天。有没有相当简单的方法来获取这些信息?

【问题讨论】:

    标签: sql sql-server sql-server-2005 tsql datetime


    【解决方案1】:

    您可以使用DATEFROMPARTS 声明该月的第一天,并使用EOMONTH 从第一天推导出该月的最后一个日期。

    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
    

    【讨论】:

      【解决方案2】:
      DECLARE @Month  int = 3, @Year  int = 2016
      DECLARE @StartDate DATETIME
      DECLARE @EndDate DATETIME
      
      -- First date of month
      SET @StartDate = DATEADD(MONTH, @Month-1, DATEADD(YEAR, @Year-1900, 0));
      -- Last date of month
      SET @EndDate = DATEADD(SS, -1, DATEADD(MONTH, @Month, DATEADD(YEAR, @Year-1900, 0)))
      

      这将返回带有时间组件的第一个日期和最后一个日期。

      【讨论】:

        【解决方案3】:

        当月最后日期:

        select dateadd(dd,-day(dateadd(mm,1,getdate())),dateadd(mm,1,getdate()))
        

        当月第一个日期:

        select dateadd(dd,-day(getdate())+1,getdate())
        

        【讨论】:

          【解决方案4】:
          select [FirstDay Of The Month] as Text ,convert(varchar,dateadd(d,-(day(getdate()-1)),getdate()),106) 'Date'
          union all
          select [LastDay Of The Month], convert(varchar,dateadd(d,-day(getdate()),dateadd(m,1,getdate())),106)
          

          【讨论】:

            【解决方案5】:
            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;
            

            【讨论】:

            • 这行得通。尽管我选择了不同的答案,因为我更喜欢它的语法和不使用转换。谢谢。
            【解决方案6】:
            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*/
            

            但是你需要什么来作为当月最后一天的时间部分?如果您的日期时间有午夜以外的时间部分,那么您最好只做类似

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

            如果您最终迁移到 SQL Server 2008 和精度更高的日期时间数据类型,您的代码将继续工作。

            【讨论】:

            • 谢谢。这行得通。我更喜欢这个答案,因为它似乎是最干净的。
            【解决方案7】:

            试试这个:

            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;
            

            【讨论】:

            • 这行得通。尽管我选择了不同的答案,因为我更喜欢它的语法和不使用强制转换。谢谢。
            【解决方案8】:
            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
            

            【讨论】:

            • 这行得通。尽管我选择了不同的答案,因为我更喜欢它的语法和不使用 Right。谢谢。
            【解决方案9】:

            每月的第一天: SELECT DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0)

            当月最后一天: SELECT DATEADD(ms, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()) + 1, 0))

            用一个 DateTime 变量值替换 GETDATE()。

            我很久以前从 this very handy page 那里得到的,它有一大堆其他日期计算,例如“本周的星期一”和“本月的第一个星期一”。

            【讨论】:

            • 这行得通。尽管我选择了不同的答案,因为我更喜欢它的语法。您链接的页面是一个很好的信息来源。谢谢。
            猜你喜欢
            • 1970-01-01
            • 2021-12-07
            • 1970-01-01
            • 2021-08-25
            • 1970-01-01
            • 2013-01-06
            • 1970-01-01
            • 2012-05-29
            • 2016-10-10
            相关资源
            最近更新 更多