[英]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) )
簡而言之:
瞧。 您擁有包含參考時間點的月份的最后一天。
獲取每月的第一天更簡單:
select dateadd(day,-(day(current_timestamp)-1),current_timestamp)
剝離/規范化無關的時間組件留給讀者作為練習。
如果您可以使用 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.