Перейти к содержимому

Как вывести последнюю дату в sql

  • автор:

EOMONTH (Transact-SQL)

Эта функция возвращает последний день месяца, содержащего указанную дату, с необязательным смещением.

Для вычисления начала месяца можно использовать DATETRUNC .

Синтаксис

EOMONTH ( start_date [ , month_to_add ] ) 

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

start_date

Выражение даты, задающее дату, для которой необходимо возвратить последний день месяца.

month_to_add

Необязательное целочисленное выражение, задающее количество месяцев, добавляемых к параметру start_date.

Если аргумент month_to_add имеет значение, то EOMONTH добавляет указанное число месяцев к значению start_date и возвращает последний день месяца, соответствующего полученной дате. Если это дополнение переполнено допустимым диапазоном дат, возникает EOMONTH ошибка.

Типы возвращаемых данных

date

Замечания

Функция EOMONTH может удалена к экземплярам под управлением SQL Server 2012 (11.x) и более поздних версий. Он не может удаленно использовать экземпляры с версией до SQL Server 2012 (11.x).

Примеры

А. EOMONTH с явным типом datetime

DECLARE @date DATETIME = '12/1/2022'; SELECT EOMONTH ( @date ) AS Result; GO 
Result ------------ 2022-12-31 (1 row(s) affected) 

B. EOMONTH со строковым параметром и неявным преобразованием

DECLARE @date VARCHAR(255) = '12/1/2022'; SELECT EOMONTH ( @date ) AS Result; GO 
Result ------------ 2022-12-31 (1 row(s) affected) 

C. Функция EOMONTH с параметром month_to_add и без него

Значения в этих результирующих наборах отражают дату выполнения между 12/01/2022 и 12/31/2022 (включительно).

DECLARE @date DATETIME = GETDATE(); SELECT EOMONTH ( @date ) AS 'This Month'; SELECT EOMONTH ( @date, 1 ) AS 'Next Month'; SELECT EOMONTH ( @date, -1 ) AS 'Last Month'; GO 
This Month ----------------------- 2022-12-31 (1 row(s) affected) Next Month ----------------------- 2012-01-31 (1 row(s) affected) Last Month ----------------------- 2022-11-30 (1 row(s) affected) 

Обратная связь

Были ли сведения на этой странице полезными?

Как получить последнюю строку sql

Чтобы получить последнюю строку в таблице, можно воспользоваться следующей командой:

Есть что добавить? Зарегистрируйтесь

Курсы по программированию на Хекслете

Backend-разработка

Разработка серверной части сайтов и веб-приложений

Frontend-разработка

Разработка внешнего интерфейса сайтов и веб-приложений и верстка

Создание сайтов

Разработка сайтов и веб-приложений на JS, Python, Java, PHP и Ruby on Rails

Тестирование

Ручное тестирование и автоматизированное тестирование на JS, Python, Java и PHP

Аналитика данных

Сбор, анализ и интерпретация данных на Python

Интенсивные курсы

Интенсивное обучение для продолжающих

DevOps

Автоматизация настройки локального окружения и серверов, развертывания и деплоя

Веб-разработка

Разработка, верстка и деплой сайтов и веб-приложений, трудоустройство для разработчиков

Математика для программистов

Обучение разделам математики, которые будут полезны при изучении программирования

JavaScript

Разработка сайтов и веб-приложений и автоматизированное тестирование на JS

Python

Веб-разработка, автоматическое тестирование и аналитика данных на Python

Java

Веб-разработка и автоматическое тестирование на Java

PHP

Веб-разработка и автоматическое тестирование на PHP

Ruby

Разработка сайтов и веб-приложений на Ruby on Rails

Go

Курсы по веб-разработке на языке Go

HTML

Современная верстка с помощью HTML и CSS

SQL

Проектирование базы данных, выполнение SQL-запросов и изучение реляционных СУБД

Git

Система управления версиями Git, регулярные выражения и основы командой строки

Похожие вопросы

26 октября 2021

26 октября 2021

26 октября 2021

26 октября 2021

  • 8 800 100 22 47 бесплатно по РФ
  • +7 495 085 28 38 бесплатно по Москве

Направления

  • Курсы «Backend-разработка»
  • Курсы «Frontend-разработка»
  • Курсы «Создание сайтов»
  • Курсы «Тестирование»
  • Курсы «Аналитика данных»
  • Интенсивные курсы
  • Курсы DevOps
  • Курсы «Веб-разработка»
  • Курсы «Математика для программистов»
  • Все курсы

О Хекслете

  • О нас
  • Карьера в Хекслете
  • Хекслет Колледж

ООО «Хекслет Рус» 432071, г. Ульяновск, пр-т Нариманова, дом 1Г, оф. 23 ОГРН 1217300010476

  • Справка
  • Вопросы и ответы
  • Сообщество
  • Дополнительно
  • Условия использования
  • Соглашение об обработке ПД
  • Оферта
  • Акции

Как вывести последнюю дату в sql

← →
Kostafey © ( 2008-06-24 13:43 ) [0]

Имеется таблица (STRZAP) вида:
ind1 — идентификатор
PCH_NAME — назвние части
DAT — дата/время ввода
и ряд других полей

т.е.:
ind1 PCH_NAME DAT
——- ———— ——————- .
11 ПЧ-1 24.06.2008 12:49:00 .
6 ПЧ-1 24.06.2008 12:51:46 .
12 ПЧ-2 24.06.2008 13:12:25 .
13 ПЧ-2 24.06.2008 13:12:29 .

Нужно получить набор данных в котором будут записи,
введенные каждой частью последними (в этот же день)

Для приведенного фрагмента:

ind1 PCH_NAME DAT
——- ———— ——————- .
6 ПЧ-1 24.06.2008 12:51:46 .
13 ПЧ-2 24.06.2008 13:12:29 .

Так как же получить такой НД?

SELECT PCH_NAME, max(DAT) as LastEntered
FROM STRZAP
WHERE
(
DAY(DAT)=DAY(GETDATE()) AND
MONTH(DAT)=MONTH(GETDATE()) AND
YEAR(DAT)=YEAR(GETDATE())
)
group by PCH_NAME

Этот код позволяет получить НД с полями времени
и названия части, а как полчить другие поля
соответсвующие этим записям?

← →
stas © ( 2008-06-24 13:46 ) [1]

еще раз присоединить эту таблицу по дате и ID

← →
stas © ( 2008-06-24 13:49 ) [2]

Ну или так (для MSSQL)
SELECT * FROM STRZAP
WHERE ind1= (select top 1 ind1 from STRZAP AS S
where S.PCH_NAME=STRZAP.PCH_NAME order by dat desc)

← →
Kostafey © ( 2008-06-24 13:50 ) [3]

> еще раз присоединить эту таблицу по дате и ID

Так id в запросе

> SELECT PCH_NAME, max(DAT) as LastEntered
> FROM STRZAP
> WHERE
> (
> DAY(DAT)=DAY(GETDATE()) AND
> MONTH(DAT)=MONTH(GETDATE()) AND
> YEAR(DAT)=YEAR(GETDATE())
> )
> group by PCH_NAME

нет. Есть только название части и время.

← →
Kostafey © ( 2008-06-24 13:51 ) [4]

> [2] stas © (24.06.08 13:49)

а.
Все, понял, спасибо!

SELECT * FROM STRZAP
WHERE dat= (select max(dat) from STRZAP AS S
where S.PCH_NAME=STRZAP.PCH_NAME)

а если другие поля в выборке не нужны, то просто

select PCH_NAME,max(dat) from STRZAP AS S
group by 1

← →
stas © ( 2008-06-24 14:17 ) [6]

SELECT * FROM STRZAP
WHERE dat= (select max(dat) from STRZAP AS S
where S.PCH_NAME=STRZAP.PCH_NAME)

Если даты одинаковые, то будет двоить и т.д.

← →
Павел Калугин © ( 2008-06-24 14:53 ) [7]


> stas © (24.06.08 14:17) [6]

цель этого запроса выбрать все за конкретную дату (в данном случае последнюю) . И что там будет «удвоено»?

← →
Johnmen © ( 2008-06-24 14:56 ) [8]


> stas © (24.06.08 14:17) [6]
> Если даты одинаковые, то будет двоить

И чему это противоречит?

> и т.д.

Что конкретно т.д.?

← →
stas © ( 2008-06-24 15:02 ) [9]

Павел Калугин © (24.06.08 14:53) [7]
ну если так, то да.
Johnmen © (24.06.08 14:56) [8]
троить, четверить. 🙂

← →
stas © ( 2008-06-24 15:08 ) [10]

Павел Калугин © (24.06.08 14:53) [7]
Дело в том что приведеный запрос возвращает именно по одной записи
на каждую PCH_NAME, исходя из этого и был написан мой запрос.

SELECT PCH_NAME, max(DAT) as LastEntered
FROM STRZAP
WHERE
(
DAY(DAT)=DAY(GETDATE()) AND
MONTH(DAT)=MONTH(GETDATE()) AND
YEAR(DAT)=YEAR(GETDATE())
)
group by PCH_NAME

← →
Johnmen © ( 2008-06-24 16:32 ) [11]


> stas © (24.06.08 15:02) [9]
> троить, четверить. 🙂

Так чему же это противоречит?

> Дело в том что приведеный запрос возвращает именно по одной записи
> на каждую PCH_NAME, исходя из этого и был написан мой запрос.

Твой запрос неверный даже в рамках формальной логики. Ибо «последних» записей м.б. больше одной.

← →
stas © ( 2008-06-24 16:38 ) [12]

>Так чему же это противоречит?
не чему. Смотря что автору темы нужно.

← →
Johnmen © ( 2008-06-24 16:44 ) [13]


> не чему.

Если нИчему, то что значит [6]?

← →
stas © ( 2008-06-24 16:49 ) [14]

Johnmen © (24.06.08 16:44) [13]
если быть точным [5].
[2] будет эффективным, при наличии дополнительных условий сортировки.

← →
Johnmen © ( 2008-06-24 17:11 ) [15]


> stas © (24.06.08 16:49) [14]
> если быть точным [5].

Я точен. Т.о. [6]

> [2] будет эффективным, .

Что такое «эффективным»? Как это измерено? И по сравнению с чем?

← →
stas © ( 2008-06-24 17:19 ) [16]

в [6] это я продублировал запрос из [5].
по сравнению с 6 или 5 — как удобнее.
Измерять ненужно.

← →
Johnmen © ( 2008-06-24 17:26 ) [17]


> в [6] это я продублировал запрос из [5].

Я спрашивал про слова, которые ты там написал. Если не доходит.

> Измерять ненужно.

Тебе было откровение?
Знаешь, у меня они тоже бывают. Так вот моё откровение говорит, что не будет.

← →
stas © ( 2008-06-24 17:26 ) [18]

Просто немного усложним задачу, добавим еще поле dat2.
И нам нужно будет получить поля записи, которая соответсвует мимимальному dat2 при максимальном dat, на каждый PCH_NAME
(ого завернул)
В запросе [2] мы просто dat2 добавляем к условию сортировки.
А как быть с запросом [5] ?
(я конечно незнаю мож есть какие-то решения пока я считаю самым простым [2])

← →
Павел Калугин © ( 2008-06-24 17:32 ) [19]


> stas © (24.06.08 15:08) [10]

Данный запрос вернет последнюю запись по каждой части в текущую дату.
А теперь что делать если такое надо за каждый день строить? То есть следующий вопрос ожидаем
как посмотреть какую запись какая часть вводила последней за 3-й квартал минувшего года?
запрос в [6] модифицируется в два притопа три прихлопа.
Опять же, надо учитывать скорость поступления данных. Если данные поступают чаще чем раз в милисекунду то таки да, надо изобретать (точнее приписывать дистинкт). Но при таком количестве данных в день (скорость поступления данных сравнима с милисекундой), я думаю, тут раньше вопросы о «тормозах» появились бы.

← →
stas © ( 2008-06-24 17:32 ) [20]

Johnmen © (24.06.08 17:26) [17]
>Надеюсь что твое откровение тебя не подведет.

← →
Павел Калугин © ( 2008-06-24 17:34 ) [21]

опять же исхожу из того что «другие данные нужны» то есть не только часть и дата а например id последней записи

← →
stas © ( 2008-06-24 17:35 ) [22]

Павел Калугин © (24.06.08 17:32) [19]

В чем сложность?

declare @dat datetime

SELECT * FROM STRZAP
WHERE ind1= (select top 1 ind1 from STRZAP AS S
where S.PCH_NAME=STRZAP.PCH_NAME
AND dat
order by dat desc)

← →
Павел Калугин © ( 2008-06-24 17:38 ) [23]

хе.
1. речь про сложности с запросом в [10]
2. и получим последнюю запись в квартале а не за каждый день квартала.

← →
stas © ( 2008-06-24 17:46 ) [24]

Павел Калугин © (24.06.08 17:38) [23]
Че-то непонял, ладно я ухожу с дома напишу.
А что в 10? это не мой запрос, это автора.
Вопрос не втом что прав кто-то или нет, хочется рассмотреть эту темы что же действительно правильно, я пока все же настаиваю на мной приведенном запросе.

← →
Павел Калугин © ( 2008-06-24 18:26 ) [25]

в [6] приведен идеологически верный запрос
SELECT *
FROM STRZAP
WHERE dat= (select max(dat)
from STRZAP AS S
where S.PCH_NAME=STRZAP.PCH_NAME
)

то есть, получить все записи соответствующие условию.
Далее про «дублирование»
В каком темпе должны вводится данные что в одну милисекунду появится 2 записи? Сколько запсей будет в таблице через полгода?

← →
Anatoly Podgoretsky © ( 2008-06-24 20:00 ) [26]

> Павел Калугин (24.06.2008 17:32:19) [19]

При такой скорости поступления данных вопрос врядли здесь появится, но конечно бывают исключения.

← →
Anatoly Podgoretsky © ( 2008-06-24 20:03 ) [27]


> В каком темпе должны вводится данные что в одну милисекунду
> появится 2 записи? Сколько запсей будет в таблице через
> полгода?

А почему в одну миллисекунду, разве СУБД была озвучена.

← →
stas © ( 2008-06-24 22:58 ) [28]

Павел Калугин © (24.06.08 18:26) [25]
Элементарно — пакетная вставка, автоматизированная т.е. цикл либо прибор регистрации данных
Да я вобщем согласился ([14]) что в конкретном примере , будет достаточно [6]. В конце концов на поле с датой+PCH_NAME можно повесить уникальный индекс.
Хотя в самом начале я написал объеденить запрос с этой же таблицей т.е. [6]
Интересно что же на самом деле устроило автора.
и что по поводу — stas © (24.06.08 17:26) [18]?

← →
Kostafey © ( 2008-06-25 01:25 ) [29]

> [6] stas © (24.06.08 14:17)
> SELECT * FROM STRZAP
> WHERE dat= (select max(dat) from STRZAP AS S
> where S.PCH_NAME=STRZAP.PCH_NAME)
>
> Если даты одинаковые, то будет двоить и т.д.

Согласен. Теоретически возможно.
Хотя практически нет. Т.к. сведения по каждой
части вносятся диспетчерами раз в сутки,
но в течение суток могут корректироваться,
отсюда и требование к тому что должна быть
последняя запись. Конечно 2 записи 1 диспетчер
за тысячную секунды не внесет, а вот запросом
на insert сделать это можно.

Поэтому
[2] stas © (24.06.08 13:49)
лучше.


> [11] Johnmen © (24.06.08 16:32)
>
> > stas © (24.06.08 15:02) [9]
> > троить, четверить. 🙂
>
> Так чему же это противоречит?
>
> > Дело в том что приведеный запрос возвращает именно по
> одной записи
> > на каждую PCH_NAME, исходя из этого и был написан мой
> запрос.
>
> Твой запрос неверный даже в рамках формальной логики. Ибо
> «последних» записей м.б. больше одной.

Если это произойдет. хотя практически врядли,
то в результирующем наборе данных будет одна запись
по каждой части, это приемлемо.


> [18] stas © (24.06.08 17:26)

Расширять зарос не планируется.
знаю, все вначале так же говорят 🙂


> [27] Anatoly Podgoretsky © (24.06.08 20:03)
> А почему в одну миллисекунду, разве СУБД была озвучена.

О, виноват. MS SQL Server 2000.

Да, и нужно не забывать, что, возможно,
диспетчер еще не вводил данные сегодня,
поэтому в итоге:

SELECT * FROM STRZAP
WHERE ind1=
(
select top 1 ind1 from STRZAP AS S
where
(S.PCH_NAME=STRZAP.PCH_NAME)
and
(
DAY(DAT)=DAY(GETDATE()) AND
MONTH(DAT)=MONTH(GETDATE()) AND
YEAR(DAT)=YEAR(GETDATE())
)
order by dat desc
)

← →
Johnmen © ( 2008-06-25 10:00 ) [30]


> Если это произойдет. хотя практически врядли,
> то в результирующем наборе данных будет одна запись

И это неверно. Что я и пытался безуспешно втолковать кое-кому.
А уж если принять за аксиому «практически врядли», то запрос [6] правильнее во всех смыслах.

← →
Kostafey © ( 2008-06-25 10:22 ) [31]

> А уж если принять за аксиому «практически врядли», то запрос
> [6] правильнее во всех смыслах.

Правильнее почему?

Система имеет не только пользователей, но
и администраторов, квалификация которых
варьируется в широком диапазоне :),
так что хотелось бы чтобы результат
запроса не шокировал (читай выдавал единственную
запись по каждой части) вне зависимости
от шаманства с БД.

← →
stas © ( 2008-06-25 10:45 ) [32]

Johnmen © (25.06.08 10:00) [30]
и что по поводу — stas © (24.06.08 17:26) [18]?

Как получить последнюю по дате запись (SQLite)?

У меня есть таблица price (id, link, name, cost, date) . В столбце name содержатся имена товаров, в столбце cost — цена на соответствующий товар. Эти цены с некоторой периодичностью добавляются в таблицу. Мне необходимо вытащить из таблицы последнюю запись конкретного товара по дате. Как я это могу сделать?

Отслеживать
задан 26 янв 2023 в 0:13
55 5 5 бронзовых знаков
order by date limit 1
26 янв 2023 в 1:49

Последняя по дате = первая по убыванию дат. Первая = limit 1 | first 1 | top 1, в зависимости от диалекта sql. По убыванию дат = order by date desc.

26 янв 2023 в 3:42

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

SELECT * FROM price WHERE name = 'product_name' ORDER BY date DESC LIMIT 1; 

запрос сначала выбирает все записи с именем товара product_name , затем сортирует их по дате в порядке убывания и возвращ. только одну посл. запись с помощью оператора LIMIT 1 .

SELECT * FROM price p1 WHERE date = (SELECT MAX(date) FROM price p2 WHERE p1.name=p2.name AND p1.name='product_name') 
SELECT * FROM (SELECT * FROM price WHERE name = 'product_name' ORDER BY date DESC) as temp_table GROUP BY name 

Еще одно решение может быть функции для вашей СУБД, например ROW_NUMBER() в SQL, DENSE_RANK() в Oracle или RANK() в MySQL.

WITH temp_table AS ( SELECT id, link, name, cost, date, ROW_NUMBER() OVER (PARTITION BY name ORDER BY date DESC) as rn FROM price ) SELECT * FROM temp_table WHERE name = 'product_name' and rn = 1; 

Предложенный мной ранее запрос с использованием оператора GROUP BY может возвращать неожиданный результат, если таблица price содержит несколько записей с одинаковым именем товара и датой, так как в этом случае неопределенно, какую из этих записей вернет запрос. Есть несколько других способов решить эту задачу. Один из них — это использование сортировки и оператора LIMIT 1 в запросе. Например:

SELECT id, link, name, cost, date FROM price WHERE name = 'product_name' ORDER BY date DESC LIMIT 1; 

Этот запрос выбирает все записи с именем товара ‘product_name’, сортирует их по дате в порядке убывания и возвращает только одну последнюю запись с помощью оператора LIMIT 1.

Другой способ — подзапрос с макс. датой:

SELECT id, link, name, cost, date 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *