使用SQL返回每个月的最后一天

时间:2011-05-03 06:48:16

标签: sql

我有一个表,其中包含多个月中每个月的多个记录。有人可以帮我编写一个只返回每个月最后一天的查询。

9 个答案:

答案 0 :(得分:13)

SQL Server(其他DBMS的工作方式相同或非常类似):

SELECT
  *
FROM
  YourTable
WHERE
  DateField IN (
    SELECT   MAX(DateField)
    FROM     YourTable
    GROUP BY MONTH(DateField), YEAR(DateField)
  )

DateField上的索引在这里很有用。

PS:如果您的DateField包含时间值,则上述内容将为您提供每月的最后一条记录,而非最后一天的记录。在这种情况下,请使用方法在进行比较之前将日期时间减少到其日期值,例如this one

答案 1 :(得分:4)

我能找到最简单的方法来确定表中的日期字段是否是月末,只需添加一天并检查 日是否为1。

where DAY(DATEADD(day, 1, AsOfDate)) = 1

如果你使用它作为你的条件(假设AsOfDate是你正在寻找的日期字段),那么它只会返回AsOfDate是该月最后一天的记录。

答案 2 :(得分:2)

在SQL Server中,这是我通常相对于任意时间点到达该月的最后一天的方式:

select dateadd(day,-day(dateadd(month,1,current_timestamp)) , dateadd(month,1,current_timestamp) )

简而言之:

  1. 从您的参考时间点开始,
  2. 加1个月,
  3. 然后,从结果值中减去以天为单位的日期。
  4. 瞧!您是包含参考时间点的月份的最后一天。

    获得本月的第一天更简单:

    select dateadd(day,-(day(current_timestamp)-1),current_timestamp)
    
    1. 从您的参考时间点开始,
    2. 减去(以天为单位),比当前的每月组件少1。
    3. 剥离/标准化外来时间组件留给读者练习。

答案 3 :(得分:0)

如果您可以使用EOMONTH()函数(例如SQL Server)。它返回给定日期的一个月中的最后日期。

findById

或者,你可以使用一些日期数学。

select distinct
Date 
from DateTable
Where Date = EOMONTH(Date)

答案 4 :(得分:0)

这应该适用于Oracle DB

select  distinct last_day(trunc(sysdate - rownum)) dt
    from dual
  connect by rownum < 430
   order by 1

答案 5 :(得分:0)

我做了以下工作,效果很好。我还想要 当月的最长日期 。这是我输出的内容。注意7月的最后一个日期是24日。我在2017年7月24日拉了它,结果

Year    Month   KPI_Date
2017    4       2017-04-28
2017    5       2017-05-31
2017    6       2017-06-30
2017    7       2017-07-24


    SELECT  B.Year ,
    B.Month ,
    MAX(DateField) KPI_Date
FROM    Table A
    INNER JOIN ( SELECT  DISTINCT
                        YEAR(EOMONTH(DateField)) year ,
                        MONTH(EOMONTH(DateField)) month
                 FROM   Table
               ) B ON YEAR(A.DateField) = B.year
                      AND MONTH(A.DateField) = B.Month
GROUP BY B.Year ,
    B.Month 

答案 6 :(得分:0)

SELECT * FROM YourTableName WHERE anyfilter 
AND "DATE" IN (SELECT MAX(NameofDATE_Column) FROM YourTableName WHERE
anyfilter GROUP BY
TO_CHAR(NameofDATE_Column,'MONTH'),TO_CHAR(NameofDATE_Column,'YYYY'));

注意:此答案适用于Oracle DB

答案 7 :(得分:0)

这就是我刚刚解决的方法。 day_date是日期字段,calendar是保存日期的表。

SELECT cast(datepart(year, day_date) AS VARCHAR) 
+ '-' 
+ cast(datepart(month, day_date) AS VARCHAR) 
+ '-' 
+ cast(max(DATEPART(day, day_date)) AS VARCHAR) 'DATE'
FROM calendar
GROUP BY datepart(year, day_date)
    ,datepart(month, day_date)
ORDER BY 1

答案 8 :(得分:-1)

获取月份最后一天的简单方法是获取下个月的第一天并减去1。