代码之家  ›  专栏  ›  技术社区  ›  Brann

如何在SQL中选择一个月的第一天?

  •  244
  • Brann  · 技术社区  · 16 年前

    我只需要选择给定日期时间变量的月份的第一天。

    我知道使用这种代码很容易:

    select CAST(CAST(YEAR(@mydate) AS VARCHAR(4)) 
    + '/' + CAST(MONTH(@mydate) AS VARCHAR(2)) + '/01' AS DATETIME)
    

    但这不太优雅,可能也不太快。

    有更好的方法吗?我正在使用SQL Server 2008。

    24 回复  |  直到 7 年前
        1
  •  495
  •   LukeH    16 年前
    SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth
    
        2
  •  102
  •   Jithin Shaji    11 年前

    除上述所有答案外,还介绍了一种基于函数的方法 sql 2012

    SELECT DATEFROMPARTS(YEAR(@mydate),MONTH(@mydate),1)
    
        3
  •  27
  •   JasonMArcher TWE    11 年前

    SQL Server 2008:

    SELECT DATEADD(DAY,1,EOMONTH(@mydate,-1))
    
        4
  •  12
  •   Mayo    16 年前

    将字符串(即“5/1/2009”)转换为datetime肯定更清晰,但我们发现不久前的代码将返回该月的第一个…

    DECLARE @Date DATETIME
    //...
    SELECT DATEADD(mm, DATEDIFF(mm,0,@Date), 0)
    
        5
  •  7
  •   Abhishek Gupta    11 年前

    简单查询:

    SELECT DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0) 
    -- Instead of GetDate you can put any date.
    
        6
  •  5
  •   dove    16 年前

    可能很快。为什么不创建一个SQL函数呢?

    CREATE FUNCTION [dbo].[GetFirstDayOfMonth] ( @InputDate    DATETIME )
    RETURNS DATETIME
    BEGIN
    
        RETURN CAST(CAST(YEAR(@InputDate) AS VARCHAR(4)) + '/' + 
                    CAST(MONTH(@InputDate) AS VARCHAR(2)) + '/01' AS DATETIME)
    
    END
    GO
    
        7
  •  4
  •   Alan Burstein    12 年前

    这也是可行的:

        SELECT DATEADD(DAY,(DATEPART(DAY,@mydate)-1)*(-1),@mydate) AS FirstOfMonth
    
        8
  •  2
  •   PoloSoares    11 年前
    SELECT @myDate - DAY(@myDate) + 1
    
        9
  •  2
  •   cuongle    10 年前

    请使用此

    1. 服务器2012

      DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
      
    2. 服务器2012之前

      select  cast(cast(year('2015-06-30') as varchar(4))+'-'+ cast(month('2015-06-30') as varchar(2))+'-01' as smalldatetime)
      
        10
  •  2
  •   Suraj Rao Raas Masood    7 年前
    ----Last Day of Previous Month
    SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0))
    LastDay_PreviousMonth
    ----Last Day of Current Month
    SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0))
    LastDay_CurrentMonth
    ----Last Day of Next Month
    SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0))
    LastDay_NextMonth
    
        11
  •  1
  •   Ariel T    12 年前

    未来的谷歌用户,在MySQL上,尝试一下:

    select date_sub(ref_date, interval day(ref_date)-1 day) as day1;
    
        12
  •  1
  •   Ang Li    9 年前

    如果您今天看到这个,并且使用SQL Server 2012或更高版本,您可以使用eomonth函数,这使事情变得更简单:

    SELECT DATEADD(day, 1, EOMONTH(DATEADD(month, -1, GETDATE()))) as firstdateofmonth
    

    可以使用所需的日期变量更改getDate()。

        13
  •  1
  •   Jérémie B    8 年前

    在这里,我们可以使用下面的查询来查询月份的第一个日期和最后一个日期。

    SELECT DATEADD(DAY,1,EOMONTH(Getdate(),-1)) as 'FD',Cast(Getdate()-1 as Date)
    as 'LD'
    
        14
  •  1
  •   user692942    8 年前

    如果使用SQL Server 2012或更高版本;

    SELECT DATEADD(MONTH, -1, DATEADD(DAY, 1, EOMONTH(GETDATE())))
    
        15
  •  1
  •   Brian Widdoes    7 年前
    DECLARE @startofmonth date
    SET @startofmonth = DATEADD(dd,1,EOMONTH(Getdate(),-2))
    

    上个月的第一天-2会给你。例如,getDate()是18年10月15日。您的结果将是9/1/18。改为-1,结果将是10/1/18。0将是下个月的开始,2018年11月1日。等

    DECLARE @startofmonth date
    SET @startofmonth = DATEADD(dd,1,EOMONTH(@mydate,-1))
    
        16
  •  1
  •   Harshith Rai    7 年前

    尝试执行以下查询:

    SELECT DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE-INTERVAL 1 DAY),INTERVAL 1 DAY),INTERVAL -1 MONTH)

        17
  •  0
  •   Tushar    11 年前

    选择convert(日期,日期添加(dd,-(日期部分(dd,getDate())-1),getDate()),120)

    此函数将为您提供月份开始日期的一部分

        18
  •  0
  •   Abdul Saleem k dimitrov    11 年前
    SELECT DATEADD (DAY, -1 * (DAY(GETDATE()) - 1), GETDATE())
    

    …………………………………………………………

    如果不需要时间,则将其转换为日期;如果要将时间转换为0:00:00,则将其转换为日期,然后返回到日期时间。

    SELECT CONVERT (DATETIME,  
    CONVERT (DATE, DATEADD (DAY, -1 * (DAY(GETDATE()) - 1),
    GETDATE())))
    

    将getDate()更改为所需日期

        19
  •  0
  •   Eli    10 年前

    我使用getDate()作为要使用的日期,您可以将其替换为所需的日期。
    工作原理如下:首先,我们将日期格式设置为YYMMDD…格式截断只保留最左边的6个字符,以便只保留YYYYMM部分,然后将'01'附加为月份-瞧!您有当月的第一天。

    SELECT CAST(CONVERT(VARCHAR(6),GETDATE(),112) +'01' AS DATETIME) AS StartOfMonth
    

    顺便说一句,这方面的表现很棒!

        20
  •  0
  •   Jelly    10 年前

    我个人建议使用下面的SQL,因为当我在Condition子句中尝试使用日期函数时,它会大大降低我的查询速度。

    不管怎样,你可以试试这个。

    select CONCAT(DATEPART(YYYY,@mydate),'-',DATEPART(MM,@mydate),'-01')
    
        21
  •  0
  •   wayner    9 年前

    不要和这里的任何伟大人物竞争,而是一个简单的建议,稍微不同于上面接受的答案。

    select dateadd(day, -(datepart(day,@date)+1,@date)
    
        22
  •  0
  •   michal    7 年前

    我喜欢使用 FORMAT ,甚至可以指定时间

    SELECT FORMAT(@myDate,'yyyy-MM-01 06:00') first_of_a_month
    
        23
  •  0
  •   BornToCode    7 年前

    在SQL Server 2012中,

     select getdate()-DATEPART(day, getdate())+1
    
     select DATEADD(Month,1,getdate())-DATEPART(day, getdate())
    
        24
  •  -2
  •   jsarma    11 年前

    这看起来很简单,但对我很有用:

      select DATE_FORMAT(NOW(), '%Y-%m-1')