我只需要选择一个给定的日期时间变量月份的第一天。
我知道这是很容易使用这种代码,这样做:
select CAST(CAST(YEAR(@mydate) AS VARCHAR(4))
+ '/' + CAST(MONTH(@mydate) AS VARCHAR(2)) + '/01' AS DATETIME)
但是,这是不是很优雅,而且很可能不是很快无论是。
有一个更好的方法吗? 我使用的是SQL Server 2008中。
我只需要选择一个给定的日期时间变量月份的第一天。
我知道这是很容易使用这种代码,这样做:
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 2008中:
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 DATEADD(DAY,(DATEPART(DAY,@mydate)-1)*(-1),@mydate) AS FirstOfMonth
SELECT @myDate - DAY(@myDate) + 1
请使用
对于Server 2012
DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
Server 2012的前
select cast(cast(year('2015-06-30') as varchar(4))+'-'+ cast(month('2015-06-30') as varchar(2))+'-01' as smalldatetime)
----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
未来的Google,在MySQL,试试这个:
select date_sub(ref_date, interval day(ref_date)-1 day) as day1;
如果您正在寻找这个在今天,和使用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())))
DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(Getdate(),-2))
-2将让你最后一个月的第一天。 即,GETDATE()是18年10月15日。 您的结果将是18年9月1日。 更改为-1,你的结果将是18年10月1日。 0将是下个月开始,2018年11月1日。等等等等。
要么
DECLARE @startofmonth date
SET @startofmonth = DATEADD(dd,1,EOMONTH(@mydate,-1))
尝试执行以下查询:
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,转换为日期,然后回DATETIME。
SELECT CONVERT (DATETIME,
CONVERT (DATE, DATEADD (DAY, -1 * (DAY(GETDATE()) - 1),
GETDATE())))
更改GETDATE()到您想要的日期
我用GETDATE()作为一个日期的工作,你可以用你需要的日期更换。
下面是如何工作的:首先,我们在格式YYYYMMDD日期...格式截断为只保留6个最左边的字符以只保留YYYYMM部分,然后追加“01”为一个月 - 瞧! 你当月的第一天。
SELECT CAST(CONVERT(VARCHAR(6),GETDATE(),112) +'01' AS DATETIME) AS StartOfMonth
BTW,性能上这是伟大的!
我个人的建议之下,因为当我尝试的条件条款,其减缓我的查询速度在使用日期的功能非常多的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 dateadd(mm, -1,dateadd(dd, +1, eomonth(getdate()))) as FirstDay,
eomonth(getdate()) as LastDay
这似乎太简单,但对我的作品:
select DATE_FORMAT(NOW(), '%Y-%m-1')