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

Bra*_*ann 285 sql t-sql sql-server datetime sql-server-2008

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

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

select CAST(CAST(YEAR(@mydate) AS VARCHAR(4)) 
+ '/' + CAST(MONTH(@mydate) AS VARCHAR(2)) + '/01' AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

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

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

Luk*_*keH 558

SELECT DATEADD(month, DATEDIFF(month, 0, @mydate), 0) AS StartOfMonth
Run Code Online (Sandbox Code Playgroud)

  • 应该注意的是,马丁史密斯提到的错误只能"影响"性能,而不是正确性. (60认同)
  • 万一有人想知道`SELECT EOMONTH(@mydate)AS EndOfMonth`会给你这个月的最后一天. (26认同)
  • [如果使用这种方法,有一个基数估计错误需要注意](http://stackoverflow.com/a/18242413/73226) (19认同)
  • 这是[解释为什么以及如何工作](http://www.jasonstrate.com/2010/03/grouping-and-rounding-dates/). (12认同)
  • 如何确定所提到的基数估算错误是否会影响我?它在2010年被标记为已修复.这是否意味着只有SQL Server 2012和更新版本是安全的,或者2008服务器是否可能已被修补? (3认同)

Jit*_*aji 126

除了以上所有答案之外,还有一种基于功能介绍的方法 sql 2012

SELECT DATEFROMPARTS(YEAR(@mydate),MONTH(@mydate),1)
Run Code Online (Sandbox Code Playgroud)


小智 44

SQL Server 2008:

SELECT DATEADD(DAY,1,EOMONTH(@mydate,-1))
Run Code Online (Sandbox Code Playgroud)

  • 这似乎仅适用于2012年及以后.http://msdn.microsoft.com/en-us/library/hh213020.aspx (10认同)
  • 它对我来说在SQL 2008 R2中不起作用. (2认同)
  • 优点是它只提到了一次源日期,如果它是从函数调用派生的,那就更简洁了。 (2认同)

Mar*_*ith 18

从 SQL Server 2022 开始,您可以使用DATETRUNC

SELECT DATETRUNC(month, @mydate)
Run Code Online (Sandbox Code Playgroud)

为了这个需要

  • 2022 年,天哪,你更新了:) (5认同)

May*_*ayo 14

将字符串(即"5/1/2009")转换为日期时间肯定更清晰,但我们发现代码会在一个月前返回...

DECLARE @Date DATETIME
//...
SELECT DATEADD(mm, DATEDIFF(mm,0,@Date), 0)
Run Code Online (Sandbox Code Playgroud)


Abh*_*pta 10

简单查询:

SELECT DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0) 
-- Instead of GetDate you can put any date.
Run Code Online (Sandbox Code Playgroud)


小智 8

这可能是一个新函数,但您也可以使用旧函数:

select DATEFROMPARTS(year(@mydate),month(@mydate),'01')
Run Code Online (Sandbox Code Playgroud)

例如,如果变量中的日期是,'2017-10-29' 它将返回日期'2017-10-01'

https://learn.microsoft.com/en-us/sql/t-sql/functions/datefromparts-transact-sql?view=sql-server-ver15


dov*_*ove 6

它可能很快.为什么不将它创建为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
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您想使用 SQL Server 2012+,您可以尝试我使用的解决方案:

SELECT DATEADD(DAY, 1, EOMONTH(DATEADD(MONTH, -1, GETDATE())))
Run Code Online (Sandbox Code Playgroud)


Pol*_*res 5

SELECT @myDate - DAY(@myDate) + 1
Run Code Online (Sandbox Code Playgroud)