我只需要选择给定 DateTime 变量的月份的第一天。
我知道使用这种代码很容易做到:
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)
从 SQL Server 2012 开始:
SELECT DATEADD(DAY,1,EOMONTH(@mydate,-1))
将字符串(即“2009 年 5 月 1 日”)转换为日期时间当然更清晰,但我们发现不久前的代码会返回当月的第一天......
DECLARE @Date DATETIME
//...
SELECT DATEADD(mm, DATEDIFF(mm,0,@Date), 0)
简单查询:
SELECT DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)
-- Instead of GetDate you can put any date.
它可能相当快。为什么不将其创建为 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 @myDate - DAY(@myDate) + 1
Operand type clash: date is incompatible with int
。我想这是因为您试图在约会时使用 -
运算符?
这可能是一个新功能,但您也可以使用旧功能:
select DATEFROMPARTS(year(@mydate),month(@mydate),'01')
例如,如果变量中的日期是 '2017-10-29'
,它将返回日期 '2017-10-01'
当月的第一天和最后一天:
select dateadd(mm, -1,dateadd(dd, +1, eomonth(getdate()))) as FirstDay,
eomonth(getdate()) as LastDay
这也有效:
SELECT DATEADD(DAY,(DATEPART(DAY,@mydate)-1)*(-1),@mydate) AS FirstOfMonth
请使用这个
对于 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)
这个查询应该在 MySQL 上运行良好:
SELECT concat(left(curdate(),7),'-01')
如果您想使用 SQL Server 2012+,可以尝试我使用的解决方案:
SELECT DATEADD(DAY, 1, EOMONTH(DATEADD(MONTH, -1, GETDATE())))
我使用 GETDATE() 作为日期,您可以将其替换为您需要的日期。以下是它的工作原理:首先我们将日期格式化为 YYYYMMDD... 格式截断以仅保留最左边的 6 个字符以便仅保留 YYYYMM 部分,然后将“01”附加为月份 - 瞧!你有当月的第一天。
SELECT CAST(CONVERT(VARCHAR(6),GETDATE(),112) +'01' AS DATETIME) AS StartOfMonth
顺便说一句,这方面的表现很棒!
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))
----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
未来的谷歌人,在 MySQL 上,试试这个:
select date_sub(ref_date, interval day(ref_date)-1 day) as day1;
sql-server
问题,date_sub
和 interval
是 mysql
。
如果您今天正在查看此内容,并且使用 SQL Server 2012 或更高版本,您将拥有 EOMONTH 函数,这使事情变得更容易:
SELECT DATEADD(day, 1, EOMONTH(DATEADD(month, -1, GETDATE()))) as firstdateofmonth
您可以使用所需的任何日期变量更改 GETDATE()。
在这里,我们可以使用以下查询来查询该月的第一个日期和该月的最后一个日期。
SELECT DATEADD(DAY,1,EOMONTH(Getdate(),-1)) as 'FD',Cast(Getdate()-1 as Date)
as 'LD'
如果使用 SQL Server 2012 或更高版本;
SELECT DATEADD(MONTH, -1, DATEADD(DAY, 1, EOMONTH(GETDATE())))
尝试执行以下查询:
SELECT DATE_ADD(DATE_ADD(LAST_DAY(CURRENT_DATE-INTERVAL 1 DAY),INTERVAL 1 DAY),INTERVAL -1 MONTH)
选择 CONVERT(日期,DATEADD(dd,-(DATEPART(dd,getdate())-1),getdate()),120)
此功能将为您提供当月开始日期的日期部分
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() 更改为您想要的日期
我个人推荐下面的sql,因为当我尝试在条件子句中使用日期函数时,它会大大降低我的查询速度。
无论如何,请随意尝试。
select CONCAT(DATEPART(YYYY,@mydate),'-',DATEPART(MM,@mydate),'-01')
不是要与这里的任何伟大的思想竞争,而是一个与上面接受的答案略有不同的简单建议。
select dateadd(day, -(datepart(day,@date)+1,@date)
我喜欢用FORMAT
,你甚至可以指定时间
SELECT FORMAT(@myDate,'yyyy-MM-01 06:00') first_of_a_month
在 SQL Server 2012 中,
select getdate()-DATEPART(day, getdate())+1
select DATEADD(Month,1,getdate())-DATEPART(day, getdate())
对于仍在寻找答案的任何人来说,这就像一种魅力,并且消除了任何日期添加。时间戳是可选的,以防需要指定,但也可以不指定。
SELECT left(convert(varchar, getdate(),23),7)+'-01 00:00:00'
获取我们在 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
有什么不一样的!使用格式。
DECLARE @Date Date =GetDate();
SELECT CONVERT(Date,Format(@Date,'yyyyMM01'));
如果我们要转换为日期列或变量,我们可以删除转换
DECLARE @Date Date =GetDate();
SELECT @Date =Format(@Date,'yyyyMM01');
SELECT [Date]=@Date
玩得开心 :)
SELECT EOMONTH(@mydate) AS EndOfMonth
会告诉您该月的最后一天。