ChatGPT解决这个技术问题 Extra ChatGPT

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

我只需要选择给定 DateTime 变量的月份的第一天。

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

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

但不幸的是,这不是很优雅,也不是很快。

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


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

应该注意的是,Martin Smith 提到的错误“只能”影响性能,而不是正确性。
如果有人想知道 SELECT EOMONTH(@mydate) AS EndOfMonth 会告诉您该月的最后一天。
我如何确定上面提到的基数估计错误是否会影响我?它在 2010 年被标记为已修复。这是否意味着只有 SQL Server 2012 和更新版本是安全的,或者 2008 年的服务器可能已被修补?
J
Jithin Shaji

除了以上所有答案,一种基于sql 2012中介绍的函数的方法

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

C
ChrisG

从 SQL Server 2012 开始:

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

这似乎仅适用于 2012 年及以后。 msdn.microsoft.com/en-us/library/hh213020.aspx
它的优点是它只提到了一次源日期,如果它是从函数调用派生的,那就更整洁了。
简单的!我喜欢
M
Mayo

将字符串(即“2009 年 5 月 1 日”)转换为日期时间当然更清晰,但我们发现不久前的代码会返回当月的第一天......

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

A
Abhishek Gupta

简单查询:

SELECT DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0) 
-- Instead of GetDate you can put any date.

我刚试过,它有效。谢谢
d
dove

它可能相当快。为什么不将其创建为 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

P
PoloSoares
SELECT @myDate - DAY(@myDate) + 1

真正简单而优雅的解决方案,但请记住,如果在变量中指定,这也会返回日期的时间部分。
我无法让它工作。除了额外的右括号外,我还收到此错误:Operand type clash: date is incompatible with int。我想这是因为您试图在约会时使用 - 运算符?
我不知道它在性能方面有多好,但它确实可以完成工作。
@Sam,您遇到了冲突,因为简单的算术 (+, -) 适用于日期时间,而不适用于日期。
S
Standin.Wolf

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

select DATEFROMPARTS(year(@mydate),month(@mydate),'01')

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

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


P
Paul Roub

当月的第一天和最后一天:

select dateadd(mm, -1,dateadd(dd, +1, eomonth(getdate()))) as FirstDay, 
eomonth(getdate()) as LastDay

A
Alan Burstein

这也有效:

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

c
cuongle

请使用这个

对于 Server 2012 DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1) 在 Server 2012 之前选择 cast(cast(year('2015-06-30') as varchar( 4))+'-'+ cast(月('2015-06-30') as varchar(2))+'-01' as smalldatetime)


U
Uladz Kha

这个查询应该在 MySQL 上运行良好:

SELECT concat(left(curdate(),7),'-01') 

D
Dale K

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

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

E
Eli

我使用 GETDATE() 作为日期,您可以将其替换为您需要的日期。以下是它的工作原理:首先我们将日期格式化为 YYYYMMDD... 格式截断以仅保留最左边的 6 个字符以便仅保留 YYYYMM 部分,然后将“01”附加为月份 - 瞧!你有当月的第一天。

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

顺便说一句,这方面的表现很棒!


B
Brian Widdoes
DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(Getdate(),-2))

-2 将为您提供上个月的第一天。即,getdate() 是 10/15/18。您的结果将是 2018 年 9 月 1 日。更改为 -1,您的结果将是 10/1/18。 0 将是下个月的开始,2018 年 11 月 1 日.. 等等。

或者

DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(@mydate,-1))

S
Suraj Rao
----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

但是 OP 正在寻找本月的第一天。最后一天,您可以只使用 EOMONTH() - 自 2012 年以来一直如此。
A
Ariel T

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

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

这是一个 sql-server 问题,date_subintervalmysql
好,点,我编辑了回复。我认为它仍然与线程相关。
A
Ang Li

如果您今天正在查看此内容,并且使用 SQL Server 2012 或更高版本,您将拥有 EOMONTH 函数,这使事情变得更容易:

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

您可以使用所需的任何日期变量更改 GETDATE()。


J
Jérémie B

在这里,我们可以使用以下查询来查询该月的第一个日期和该月的最后一个日期。

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

u
user692942

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

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

H
Harshith Rai

尝试执行以下查询:

SELECT DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE-INTERVAL 1 DAY),INTERVAL 1 DAY),INTERVAL -1 MONTH)


T
Tushar

选择 CONVERT(日期,DATEADD(dd,-(DATEPART(dd,getdate())-1),getdate()),120)

此功能将为您提供当月开始日期的日期部分


A
Abdul Saleem
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() 更改为您想要的日期


J
Jelly

我个人推荐下面的sql,因为当我尝试在条件子句中使用日期函数时,它会大大降低我的查询速度。

无论如何,请随意尝试。

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

佚名

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

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

m
michal

我喜欢用FORMAT,你甚至可以指定时间

SELECT FORMAT(@myDate,'yyyy-MM-01 06:00') first_of_a_month

B
BornToCode

在 SQL Server 2012 中,

 select getdate()-DATEPART(day, getdate())+1

 select DATEADD(Month,1,getdate())-DATEPART(day, getdate())

c
chimpSociety

对于仍在寻找答案的任何人来说,这就像一种魅力,并且消除了任何日期添加。时间戳是可选的,以防需要指定,但也可以不指定。

SELECT left(convert(varchar, getdate(),23),7)+'-01 00:00:00'

r
rinku Choudhary

获取我们在 SQL 中作为参数传递的日期中的第一个日期和最后一个日期

     @date DATETIME
    SELECT @date = GETDATE()
    SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@date)-1),@date),105) AS value,
    'First Day of Current Month' AS name
    UNION
    SELECT CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(DATEADD(mm,1,@date))),
    DATEADD(mm,1,@date)),105),
    'Last Day of Current Month'
    GO


      **OutPut**

12/01/2019  First Day of Current Month
12/31/2019  Last Day of Current Month

W
Waleed A.K.

有什么不一样的!使用格式。

DECLARE @Date Date =GetDate();
SELECT CONVERT(Date,Format(@Date,'yyyyMM01'));

如果我们要转换为日期列或变量,我们可以删除转换

DECLARE @Date Date =GetDate();
SELECT @Date =Format(@Date,'yyyyMM01');
SELECT [Date]=@Date

玩得开心 :)