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

Как сравнивать даты в sql

  • автор:

Как сравнить даты в полях строк для каждого сотрудника отдельно? SQL [дубликат]

Есть таблица: введите сюда описание изображения Надо получить из нее вот такую выборку по заданию: Найти модель первой машины каждого из сотрудников и выести в этих полях null, если у сотрудника никогда не было машины введите сюда описание изображения

Отслеживать
4,925 6 6 золотых знаков 11 11 серебряных знаков 29 29 бронзовых знаков
задан 20 июл 2022 в 22:01
21 1 1 бронзовый знак

В чем конкретная сложность? Если бы задача была «Найти модель самой дешевой машины каждого из сотрудников и вывести в этих полях null, если у сотрудника никогда не было машины» — то знаете, как делать? Именно с датой проблема?

20 июл 2022 в 22:24
непонятно, как даты сравнивать не в строке по столбцам, а по строках с условием одно имя
20 июл 2022 в 22:36
Дубликат вопроса Фильтр повторяющихся значений по условию SQL
21 июл 2022 в 4:33
Oracle <> SQL Server <> MySQL <> DB2 <> Cosmos DB, и т.п.
21 июл 2022 в 20:02

MySQL v.8.0 поддерживает CTE: dev.mysql.com/doc/refman/8.0/en/with.html Разные СУБД поддерживают разные диалекты SQL. Вот почему когда задаете вопрос, необходимо предоставить «Минимальный воспроизводимый пример» ##1-4.

21 июл 2022 в 21:10

2 ответа 2

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

Пожалуйста, попробуйте следующее решение. Это для MS SQL Server.

CTE создает сегменты для каждого сотрудника, упорядоченные по дате. Вот почему внешний SELECT использует seq=1, то есть модель первой машины.

Невидимый вывод из CTE:

+-----+--------+----------+------------+----+-------+-------------+-----+ | _ID | car_id | owner_id | start_date | id | _Name | model | seq | +-----+--------+----------+------------+----+-------+-------------+-----+ | 1 | 1 | 1 | 2016-04-12 | 1 | John | Volvo XC90 | 1 | | 6 | 45 | 1 | 2016-10-17 | 1 | John | Opel Astra | 2 | | 4 | 15 | 2 | 2016-04-12 | 2 | Kim | Volvo XC90 | 1 | | 2 | 1 | 2 | 2016-10-17 | 2 | Kim | Volvo XC90 | 2 | | 5 | 34 | 3 | 2016-04-12 | 3 | Smith | Opel Zafira | 1 | | 3 | 1 | 3 | 2016-12-19 | 3 | Smith | Volvo XC90 | 2 | | 7 | NULL | NULL | NULL | 4 | Paul | NULL | 1 | +-----+--------+----------+------------+----+-------+-------------+-----+ 

SQL

-- DDL и образец вставки данных, начало DECLARE @tbl TABLE ( _ID INT IDENTITY PRIMARY KEY, car_id INT, owner_id INT, [start_date] DATE, id INT, _Name VARCHAR(20), model VARCHAR(20) ); INSERT INTO @tbl (car_id, owner_id, [start_date], id, _Name, model) VALUES (1, 1, '2016-04-12', 1, 'John', 'Volvo XC90'), (1, 2, '2016-10-17', 2, 'Kim', 'Volvo XC90'), (1, 3, '2016-12-19', 3, 'Smith', 'Volvo XC90'), (15, 2, '2016-04-12', 2, 'Kim', 'Volvo XC90'), (34, 3, '2016-04-12', 3, 'Smith', 'Opel Zafira'), (45, 1, '2016-10-17', 1, 'John', 'Opel Astra'), (NULL, NULL, NULL, 4, 'Paul', NULL); -- DDL и образец вставки данных, конец ;WITH rs AS ( SELECT * , seq = ROW_NUMBER() OVER (PARTITION BY id ORDER BY [start_date] ASC) FROM @tbl ) SELECT _Name, model AS first_brand FROM rs WHERE seq = 1 ORDER BY id; 

Результат

+-------+-------------+ | _Name | first_brand | +-------+-------------+ | John | Volvo XC90 | | Kim | Volvo XC90 | | Smith | Opel Zafira | | Paul | NULL | +-------+-------------+ 

Как сравнивать даты в sql

В первом случае мы ищем дедлайны за последние 30 дней. Во втором — дедлайны за последние и за следующие 30 дней.

Николай Уровень 77 Expert
3 ноября 2022

«Подумай, почему в прошлый раз была одна строка, а в этот раз – три?» — потому что от даты дедлайна отнимаем текущую дату и если она меньше 30, то строка попадает в результат, правильно?

Nikita Shamrai Уровень 108 Expert
30 октября 2022

Тут хорошие задачи. Если бы еще последние предложения где подсказка какие функции использовать было скрыто — было бы супер

Денис Уровень 108 Expert
14 октября 2022

«Подумай, почему в прошлый раз была одна строка, а в этот раз – три?» Но в прошлый раз было 4 строки.

Сообщество

JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.

Подписывайтесь
Язык интерфейса
«Программистами не рождаются» © 2024 JavaRush
Скачивайте наши приложения
«Программистами не рождаются» © 2024 JavaRush

Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.

Как сравнивать даты в sql

Строковый формат даты сравнивать недопустимо:

IF (‘15.05.2002’ > ‘31.03.2002’)
PRINT ‘Больше’
ELSE
PRINT ‘Меньше’

Выдает значение: ‘Меньше’

Сравнивать даты можно только в формате даты:

IF (CONVERT(DATETIME, CONVERT(varchar,GetDate(),104)) > CONVERT(DATETIME, ‘31.03.2002’))
PRINT ‘Больше’
ELSE
PRINT ‘Меньше’

Server: Msg 242, Level 16, State 3, Line 1
The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
Меньше

Best wishes, Taras
Re: Как сравнивать даты в MS SQL

От: Toughpheeckouse
Дата: 15.05.02 06:00
Оценка: 2 (1)

Здравствуйте Good Man, Вы писали:

GM>Строковый формат даты сравнивать недопустимо:

GM>IF (‘15.05.2002’ > ‘31.03.2002’)
GM>PRINT ‘Больше’
GM>ELSE
GM>PRINT ‘Меньше’

GM>Выдает значение: ‘Меньше’

если он правильно записан, то допустимо

IF ( > ) PRINT 'Больше' ELSE PRINT 'Меньше'
ODBC defines escape sequences for date, time, and timestamp literals. The syntax of these escape sequences is as follows:   In BNF notation, the syntax is as follows: ODBC-date-time-escape ::= ODBC-date-escape | ODBC-time-escape | ODBC-timestamp-escape ODBC-date-escape ::= ODBC-esc-initiator d 'date-value' ODBC-esc-terminator ODBC-time-escape ::= ODBC-esc-initiator t 'time-value' ODBC-esc-terminator ODBC-timestamp-escape ::= ODBC-esc-initiator ts 'timestamp-value' ODBC-esc-terminator ODBC-esc-initiator ::= < ODBC-esc-terminator ::= >date-value ::= years-value date-separator months-value date-separator days-value time-value ::= hours-value time-separator minutes-value time-separator seconds-value timestamp-value ::= date-value timestamp-separator time-value date-separator ::= - time-separator ::= : timestamp-separator ::= (The blank character) years-value ::= digit digit digit digit months-value ::= digit digit days-value ::= digit digit hours-value ::= digit digit minutes-value ::= digit digit seconds-value ::= digit digit[.digit…]

Думайте сами, решайте сами.
Re: Как сравнивать даты в MS SQL

От: vav
Дата: 15.05.02 08:44
Оценка: 1 (1)

GM>Server: Msg 242, Level 16, State 3, Line 1
GM>The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

А как должен сервер понимать твою строку?
как ‘dd.mm.yyyy’, ‘mm.dd.yyyy’ или еще как-нибудь?

Если строка получается на клиенте, то рекомендую передавать параметры как datatime, а не как строку..

Если нужно иметь эту переменную на сервере, то
составь свою дату из кусочков используя DATEADD
(хотя можно конечно изменить строку на ‘03.31.2002’ и все заработает до первого изменения региональных настроек)

Re[2]: Как сравнивать даты в MS SQL

От: Good Man
Дата: 15.05.02 15:43
Оценка:

Где “ Date_update” типа DateTime.

Best wishes, Taras
Re: Как сравнивать даты в MS SQL

От: Sinclair https://github.com/evilguest/
Дата: 15.05.02 20:59
Оценка: 1 (1)

Здравствуйте Good Man, Вы писали:

GM>Строковый формат даты сравнивать недопустимо:

GM>IF (‘15.05.2002’ > ‘31.03.2002’)
GM>PRINT ‘Больше’
GM>ELSE
GM>PRINT ‘Меньше’

GM>Выдает значение: ‘Меньше’

вообще-то надо так:

IF GetDate() > CONVERT(DATETIME, '31.03.2002', 104)) PRINT 'Больше' ELSE PRINT 'Меньше'

GM>Возникает ошибка:

GM>Server: Msg 242, Level 16, State 3, Line 1
GM>The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
Логично, черт возьми. Он не может понять, как конвертить ‘31.03.2002’ в дату — надо указать стиль.

Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Как сравнивать даты в MS SQL

От: Good Man
Дата: 16.05.02 02:44
Оценка:

Здравствуйте Sinclair, Вы писали:

Какая выборка будет, производится быстрее в MS SQL 2000?

Предположим, что есть таблица «Table1». В таблице есть поле “DateField1” типа DateTime. Приведу два примера:

SELECT * FROM Table1
WHERE CONVERT(varchar, DateField1, 104) = ‘15.05.2002’

SELECT * FROM Table1
WHERE DateField1 = CONVERT(DATETIME, ‘2002-05-15 00:00:00’, 102)»;

В Access вообще нет необходимости заниматься конвертированием:

«…WHERE DateField1 = #05/15/02#…»

Конвертирование, при сравнении дат, должно сильно уменьшать скорость выборки данных в MS SQL 2000.

Best wishes, Taras
Re[3]: Как сравнивать даты в MS SQL

От: Sinclair https://github.com/evilguest/
Дата: 16.05.02 07:30
Оценка: 2 (1)

Здравствуйте Good Man, Вы писали:

GM>Здравствуйте Sinclair, Вы писали:

GM>Какая выборка будет, производится быстрее в MS SQL 2000?

GM>Предположим, что есть таблица «Table1». В таблице есть поле “DateField1” типа DateTime. Приведу два примера:

GM>Вариант 1:

GM>SELECT * FROM Table1
GM>WHERE CONVERT(varchar, DateField1, 104) = ‘15.05.2002’

GM>Вариант 2:

GM>SELECT * FROM Table1
GM>WHERE DateField1 = CONVERT(DATETIME, ‘2002-05-15 00:00:00’, 102)»;
Ясен пень — вариант 2 будет выполняться не медленнее, т.к. в нем преобразование выполняется лишь раз — в начале запроса. Использование непреобразованного значения поля позволяет оптимизировать запрос при помощи индексов. Суперумный сервер мог бы построить обратное преобразование в случае 1 и свести его к случаю 2. Например, запрос

select * from t2 where int_field*2+1 < 41

легко сводится к

select * from t2 where int_field < 20

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

select * from t2 where int_field1+int_field2

и то выполняются фулл сканом.

GM>В Access вообще нет необходимости заниматься конвертированием:

GM>«…WHERE DateField1 = #05/15/02#…»

GM>Конвертирование, при сравнении дат, должно сильно уменьшать скорость выборки данных в MS SQL 2000.
Нет. Правильно эта фраза читается вот так:
Конвертирование при сравнении дат может сильно уменьшить скорость выполнения запроса в MS SQL 2000
Вариант 2, рассмотренный выше, выполняется не хуже, чем select * from t2 where int_field < 20.

Как сравнивать даты в sql

подскажите, пожалста что неправильно делаю.

вот такой запрос не отрабатывает

 select * from my_table where my_date = Date()

пишет, что 'Date' is not a recognized built-in function name.

my_date с data type 'datetime' - сюда из delphi записывается дата с помощью ADOQuery

ADOQuery1.SQL.Text:='insert into my_table (my_Date) VALUES (Convert(datetime, :DT1 ,102))'; AdoQuery1.Parameters.ParamByName('DT1').Value:=DateTimePicker1.DateTime;

дата в таблице 'my_table' выглядит вседующим образом 08.02.2011 16:25:33

мне надо сравнить с текущей датой.

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

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