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

时间:2009-10-05 15:30:06

标签: sql sql-server tsql sql-server-2008 datetime

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

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

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

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

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

32 个答案:

答案 0 :(得分:518)

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

答案 1 :(得分:110)

除上述所有答案外,还有一种基于sql 2012

中介绍的功能的方法
SELECT DATEFROMPARTS(YEAR(@mydate),MONTH(@mydate),1)

答案 2 :(得分:32)

SQL Server 2008:

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

答案 3 :(得分:12)

将字符串(即“5/1/2009”)转换为日期时间肯定更清晰,但我们发现一段时间后代码会返回本月的第一天......

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

答案 4 :(得分:8)

简单查询:

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

答案 5 :(得分:5)

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

答案 6 :(得分:4)

这也有效:

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

答案 7 :(得分:2)

SELECT @myDate - DAY(@myDate) + 1

答案 8 :(得分:2)

----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

答案 9 :(得分:2)

请使用此

  1. 对于Server 2012

    DATEFROMPARTS(year('2015-06-30'),month('2015-06-30'),1)
    
  2. 在Server 2012之前

    select  cast(cast(year('2015-06-30') as varchar(4))+'-'+ cast(month('2015-06-30') as varchar(2))+'-01' as smalldatetime)
    

答案 10 :(得分:1)

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

onPress = () => {
  if (!this.state.email.endsWith(`@my_institute.com`)) {
    alert('Invalid email');
    return;
  }

  auth()
    .signInWithEmailAndPassword(this.state.email, this.state.password)
    .catch(err => console.error(err));
}

答案 11 :(得分:1)

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

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

答案 12 :(得分:1)

如果您今天正在查看此内容,并使用SQL Server 2012或更新版本,您可以使用EOMONTH功能,这样可以简化操作:

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

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

答案 13 :(得分:1)

尝试执行以下查询:

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

答案 14 :(得分:1)

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

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

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

答案 15 :(得分:1)

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

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

答案 16 :(得分:1)

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

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

答案 17 :(得分:1)

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

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

答案 18 :(得分:0)

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

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

答案 19 :(得分:0)

我个人推荐下面的sql,因为当我尝试在条件子句中使用date函数时,它的查询速度非常慢。

无论如何都可以随意尝试。

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

答案 20 :(得分:0)

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

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

答案 21 :(得分:0)

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

SELECT CAST(CONVERT(VARCHAR(6),GETDATE(),112) +'01' AS DATETIME) AS StartOfMonth
顺便说一下,这方面表现很棒!

答案 22 :(得分:0)

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

答案 23 :(得分:0)

在Sql Server 2012中,

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

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

答案 24 :(得分:0)

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

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

答案 25 :(得分:0)

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

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

答案 26 :(得分:0)

此查询在MySQL上应能很好地工作:

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

答案 27 :(得分:0)

对于仍在寻找答案的任何人,这就像一个咒语,并且消除了任何添加的日期。时间戳是可选的(如果需要指定),但也可以不使用。

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

答案 28 :(得分:-1)

那又有什么不同呢!使用格式。

Ext.override(Ext.data.Model, {
    isActualAssociation: function (role) {
        var isThing = !role.instanceName || role.fromSingle;
        if (!isThing) {
            console.log('found weirdo', role)
        }
        return isThing;
    },

    getAssociationType: function (association) {
        if (association.fromSingle) {
            return 'hasOne';
        }
        else if (association.storeName) {
            return 'hasMany';
        }
        return 'belongsTo';
    }
});

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

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

玩得开心:)

答案 29 :(得分:-1)

尝试以下操作:

select trunc(sysdate,'MM') 
from dual;

答案 30 :(得分:-1)

尝试以下操作:

select trunc(to_date('23-03-2021','DD-MM-YYYY'),'MM') from dual;

答案 31 :(得分:-2)

这看起来很简单,但对我有用:

  select DATE_FORMAT(NOW(), '%Y-%m-1')