簡體   English   中英

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

[英]Return just the last day of each month with SQL

我有一個表,其中包含數年來每個月的每一天的多條記錄。 有人可以幫我寫一個只返回每個月的最后一天的查詢。

SQL 服務器(其他 DBMS 的工作方式相同或非常相似):

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

DateField上的索引在這里很有幫助。

PS:如果您的DateField包含時間值,上面將為您提供每個月的最后一條記錄,而不是最后一天的記錄。 在這種情況下,在進行比較之前使用一種方法將 datetime 減少到它的 date 值,例如this one

我可以找到確定表中的日期字段是否為月末的最簡單方法,只需添加一天並檢查天是否為 1。

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

如果您使用它作為您的條件(假設 AsOfDate 是您要查找的日期字段),那么它將僅返回 AsOfDate 是該月最后一天的記錄。

在 SQL 服務器中,相對於任意時間點,我通常是這樣到達該月的最后一天的:

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

簡而言之:

  1. 從您的參考時間點,
  2. 加1個月,
  3. 然后,從結果值中減去它的天數(以天為單位)。

瞧。 您擁有包含參考時間點的月份的最后一天。

獲取每月的第一天更簡單:

select dateadd(day,-(day(current_timestamp)-1),current_timestamp)
  1. 從您的參考時間點,
  2. 減去(以天為單位),比當前的當月部分少 1。

剝離/規范化無關的時間組件留給讀者作為練習。

如果您可以使用 EOMONTH() function(例如 SQL 服務器),請使用它。 它返回給定日期的一個月中的最后一個日期。

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

或者,您可以使用一些日期數學。

select distinct
Date
from DateTable
where Date = DATEADD(MONTH, DATEDIFF(MONTH, -1, Date)-1, -1)

這應該適用於 Oracle DB

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

我做了以下事情,效果很好。 我還想要當前月份的最大日期。 這是我的 output 是什么。 請注意 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 
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

獲取月份最后一天的簡單方法是獲取下個月的第一天並減去 1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM