2011-05-03 82 views
5

我有一張表,其中包含多個年份中每個月中每天的多個記錄。有人可以幫我寫一個查詢,只會返回每個月的最後一天。僅返回每個月的最後一天,使用SQL

+1

多次重複的 - 請在你的問題的相關章節搜索,以便 – 2011-05-03 06:51:06

+1

看到。我相信你會在那裏找到答案。 – 2011-05-03 06:51:59

+0

[在SQL中獲取本月的最後一天]可能的副本(http://stackoverflow.com/questions/1051488/get-the-last-day-of-the-month-in-sql) – codingbadger 2011-05-03 06:53:26

回答

10

SQL服務器(數據庫管理系統等工作,將相同或非常下同):

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

的指數DateField是有幫助這裏。

PS:如果你的DateField包含時間值,上述會給你每個月的最後記錄,而不是最後一天的記錄。在這種情況下,請在進行比較之前使用一種方法將日期時間縮短爲日期值,例如this one

+0

其純粹的日期,所以應該工作罰款..謝謝 – Matt 2011-05-03 07:15:27

-1

一種簡單的方式來獲得一個月的最後一天是獲得下個月的第一天,減去1

+0

這仍然不能回答這個問題。 – FistOfFury 2016-04-08 14:19:07

+0

@FistOfFury這是一個指針如何解決它。由於沒有標準的兼容SQL數據庫,我不能給你工作SQL代碼,直到你告訴我你使用哪個數據庫。 – 2016-04-19 12:26:46

2

在SQL Server中,這是怎麼了,我通常去的最後一天相對月到任意時間點:

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. 減(天數),比目前天OF- 1少月份組件。

剝離/標準化無關時間部分留給讀者作爲練習。

0

如果EOMONTH()函數可用(例如SQL Server),請使用EOMONTH()函數。它返回給定日期的一個月中的最後一個日期。

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

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

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

這應該對Oracle數據庫

select distinct last_day(trunc(sysdate - rownum)) dt 
    from dual 
    connect by rownum < 430 
    order by 1 
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 
2

我能找到,以確定如果表中的日期字段是月末最簡單的方法,是簡單地增加一天,並檢查是否天爲1

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

如果使用作爲你的條件(假設AsOfDate是你正在尋找的日期字段),那麼它只會返回記錄,其中AsOfDate是這個月的最後一天。

+0

我發現這對我來說是最乾淨的解決方案;在表格中包含最後一個日期的行的最佳方式是什麼? (DAY(DATEADD(day,1,AsOfDate))= 1或AsOfDate =(從[Table]中選擇max(AsOfDate)))? – StackoverflowLoser 2018-01-10 22:49:30

+0

應該這樣做,是的。這樣你會返回該月的最後一天或最後一天有空。 唯一的問題是,你可能會得到多個結果,不知道如果這是一個問題 – 2018-01-12 00:23:30

+0

謝謝,好點重新結果;只需要注意,在我的最終解決方案中,我將max datetime設置爲腳本頂部的變量,並將其用於性能測試。 – StackoverflowLoser 2018-01-12 21:00:53

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數據庫

相關問題