如何选择给定DateTime变量的月份的第一天?
我知道使用这种代码很容易做到:
select CAST(CAST(YEAR(@mydate) AS VARCHAR(4))
+ '/' + CAST(MONTH(@mydate) AS VARCHAR(2)) + '/01' AS DATETIME)
这不是很优雅,也不是很快。
还有更好的办法吗?
如何选择给定DateTime变量的月份的第一天?
我知道使用这种代码很容易做到:
select CAST(CAST(YEAR(@mydate) AS VARCHAR(4))
+ '/' + CAST(MONTH(@mydate) AS VARCHAR(2)) + '/01' AS DATETIME)
这不是很优雅,也不是很快。
还有更好的办法吗?
当前回答
这也是可行的:
SELECT DATEADD(DAY,(DATEPART(DAY,@mydate)-1)*(-1),@mydate) AS FirstOfMonth
其他回答
未来的google用户,在MySQL上试试这个:
select date_sub(ref_date, interval day(ref_date)-1 day) as day1;
它可能相当快。为什么不创建一个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
----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
不是要与这里的任何伟大的思想竞争,而是一个简单的建议,与上面公认的答案略有不同。
select dateadd(day, -(datepart(day,@date)+1,@date)
DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(Getdate(),-2))
-2会得到上个月的第一天。例如,getdate()是10/15/18。你的结果将是9/1/18。更改为-1,结果将是10/1/18。0是下个月的开始,2018年11月1日。等等。
or
DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(@mydate,-1))