如何在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
请使用这个
-
对于Server 2012
DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
-
在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')