如何选择给定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,@date)+1,@date)
其他回答
SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth
SELECT DATEADD (DAY, -1 * (DAY(GETDATE()) - 1), GETDATE())
.....................................................................
如果你不想要时间,那么将其转换为日期,或者如果想要使时间为0:00:00,转换为日期,然后回到DATETIME。
SELECT CONVERT (DATETIME,
CONVERT (DATE, DATEADD (DAY, -1 * (DAY(GETDATE()) - 1),
GETDATE())))
将GETDATE()更改为所需的日期
如果你现在正在看这个,并且使用SQL server 2012或更新的版本,你有EOMONTH函数,这让事情变得更简单:
SELECT DATEADD(day, 1, EOMONTH(DATEADD(month, -1, GETDATE()))) as firstdateofmonth
您可以使用任何日期变量更改GETDATE()。
它可能相当快。为什么不创建一个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