Вернуть только последний день каждого месяца с SQL - PullRequest
9 голосов
/ 03 мая 2011

У меня есть таблица, которая содержит несколько записей для каждого дня месяца в течение ряда лет. Может ли кто-нибудь помочь мне написать запрос, который будет возвращать только последний день каждого месяца.

Ответы [ 8 ]

14 голосов
/ 03 мая 2011

SQL Server (другие СУБД будут работать так же или очень аналогично):

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

Здесь полезен индекс для DateField.

PS:Если ваш DateField содержит значения времени, вышеприведенное даст вам самую последнюю запись каждого месяца, а не ценность последнего дня записей.В этом случае используйте метод для уменьшения даты и времени до значения даты перед выполнением сравнения, например this .

4 голосов
/ 21 ноября 2017

Самый простой способ определить, является ли поле даты в таблице концом месяца, просто добавить один день и проверить, если , что день равен 1.

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

Если вы используете это в качестве условия (при условии, что AsOfDate - это поле даты, которое вы ищете), то оно будет возвращать только записи, где AsOfDate - последний день месяца.

2 голосов
/ 04 мая 2011

В 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. вычитать (в днях), на 1 меньше, чем текущий компонент дня месяца.

Удаление / нормализация постороннего компонента времени оставляется какупражнение для читателя.

0 голосов
/ 10 января 2018
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

0 голосов
/ 25 июля 2017

Я сделал следующее, и это сработало отлично. Я также хотел максимальную дату для Текущий месяц . Вот то, что я мой вывод. Обратите внимание на последнюю дату июля, которая является 24-го. Я его вытащил 24.07.2017, отсюда и результат

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 
0 голосов
/ 08 июня 2016

Это должно работать в Oracle DB

select  distinct last_day(trunc(sysdate - rownum)) dt
    from dual
  connect by rownum < 430
   order by 1
0 голосов
/ 08 апреля 2016

Используйте функцию EOMONTH (), если она доступна вам (например, SQL Server).Возвращает последнюю дату в месяце с указанной датой.

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 голосов
/ 03 мая 2011

Простой способ получить последний день месяца - это получить первый день следующего месяца и вычесть 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...