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

我只需要select给定date时间variables的月份的第一天。

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

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

但是这不是很优雅,可能也不是很快。

有没有更好的方法来做到这一点? (我正在使用SQL Server 2008)

 SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth 

除了上面所有的答案之外,还有一种基于sql 2012引入的函数的方法

 SELECT DATEFROMPARTS(YEAR(@mydate),MONTH(@mydate),1) 

一个string(即“5/1/2009”)到date时间的转换肯定是比较清晰的,但是我们发现后面的代码会返回本月的第一个。

 DECLARE @Date DATETIME //... SELECT DATEADD(mm, DATEDIFF(mm,0,@Date), 0) 

SQL Server 2008:

 SELECT DATEADD(DAY,1,EOMONTH(@mydate,-1)) 

这可能相当快。 为什么不创build它作为一个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 

这也起作用:

  SELECT DATEADD(DAY,(DATEPART(DAY,@mydate)-1)*(-1),@mydate) AS FirstOfMonth 

简单查询:

 SELECT DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0) -- Instead of GetDate you can put any date. 
 SELECT @myDate - DAY(@myDate) + 1 

请使用这个

  1. 对于Server 2012

     DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1) 
  2. 在Server 2012之前

     select cast(cast(year('2015-06-30') as varchar(4))+'-'+ cast(month('2015-06-30') as varchar(2))+'-01' as smalldatetime) 

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

 SELECT DATEADD(DAY,1,EOMONTH(Getdate(),-1)) as 'FD',Cast(Getdate()-1 as Date) as 'LD' 

未来的谷歌,在MySQL上,试试这个:

 select date_sub(ref_date, interval day(ref_date)-1 day) as day1; 

selectCONVERT(date,DATEADD(dd, – (DATEPART(dd,getdate()) – 1),getdate()),120)

此function将为您提供月份的开始date的一部分

 SELECT DATEADD (DAY, -1 * (DAY(GETDATE()) - 1), GETDATE()) 

………………………………………….. ……………….

如果你不想要的时间,然后将其转换为DATE或如果要使时间到0:00:00,转换为DATE,然后返回到DATETIME。

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

将GETDATE()更改为所需的date

我使用GETDATE()作为date来处理,你可以用你需要的datereplace它。
这是如何工作的:首先我们格式化YYYYMMDD格式的date…格式截断,只保留最左边的6个字符,以保留YYYYMM部分,然后附加'01'作为月份,瞧! 你有本月的第一天。

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

顺便说一下,性能是伟大的!

我个人build议,下面的sql因为当我尝试使用条件子句中的datefunction,它减慢我的查询速度非常多。

反正随意尝试这个。

 select CONCAT(DATEPART(YYYY,@mydate),'-',DATEPART(MM,@mydate),'-01') 

不要与这里的任何伟大的思想竞争,而是一个简单的build议,与上面所接受的答案略有不同。

 select dateadd(day, -(datepart(day,@date)+1,@date) 

如果你今天看到这个,并且使用SQL server 2012或者更新的版本,你可以使用EOMONTH函数,它使得事情变得更简单:

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

你可以用你想要的任何datevariables来更改GETDATE()。

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

 SELECT DATEADD(MONTH, -1, DATEADD(DAY, 1, EOMONTH(GETDATE()))) 

这看起来很简单,但适合我:

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