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