Как сравнивать даты в sql
Перейти к содержимому

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

  • автор:

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

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

Отслеживать
4,935 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 | +-------+-------------+ 

DATEDIFF (Transact-SQL)

Эта функция возвращает количество пересеченных границ (целое число со знаком), указанных в аргументе datepart, за период времени, указанный в аргументах startdate и enddate.

Сведения о функции, которая обрабатывает значительные отличия значений аргументов startdate и enddate, см. в статье DATEDIFF_BIG (Transact-SQL). Обзор всех типов данных и функций даты и времени в языке Transact-SQL см. в статье Типы данных и функции даты и времени (Transact-SQL).

Синтаксис

DATEDIFF ( datepart , startdate , enddate ) 

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

Аргументы

datepart
Единицы, в которых функция DATEDIFF сообщает о разнице между startdate и enddate. К часто используемым единицам datepart относятся month или second .

Значение datepart не может быть указано в переменной или в виде строки в кавычках, например ‘month’ .

В приведенной ниже таблице перечислены все допустимые значения datepart. Функция DATEDIFF принимает либо полное имя datepart, либо любое приведенное сокращение полного имени.

Имя datepart Сокращение datepart
year y, yy, yyyy
quarter qq, q
month mm, m
dayofyear dy
day dd, d
week wk, ww
weekday dw, w
hour hh
minute mi, n
second ss, s
millisecond ms
microsecond mcs
nanosecond ns

Каждое конкретное имя аргумента datepart и сокращение этого имени datepart будут возвращать одно и то же значение.

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

Во избежание неоднозначности используйте четырехзначную запись года. Сведения о двузначном обозначении года см. в статье Настройка параметра конфигурации сервера two digit year cutoff.

enddate
См. описание аргумента startdate.

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

int

Возвращаемое значение

Значение типа int, представляющее разницу между аргументами startdate и enddate в границах, определяемых аргументом datepart.

Например, SELECT DATEDIFF(day, ‘2036-03-01’, ‘2036-02-28’); возвращает значение -2, указывая на то, что 2036 – високосный год. Это означает, что, если начать со startdDate «2036-03-01» и отсчитать -2 дня, будет достигнуто значение enddate «2036-02-28».

В качестве возвращаемого значения вне диапазона для int (от –2 147 483 648 до 2 147 483 647) DATEDIFF возвращает сообщение об ошибке. Для миллисекунды максимальная разница между startdate и enddate составляет 24 дня 20 часов 31 минута и 23 647 секунд. Для секунды максимальная разница составляет 68 лет, 19 дней, 3 часа, 14 минут и 7 секунд.

Если обоим аргументам, startdate и enddate, присвоено только значение времени, а аргумент datepart не содержит значения времени datepart, то DATEDIFF возвращает значение 0.

При вычислении возвращаемого значения DATEDIFF использует компонент смещения часовых поясов для аргументов startdate или enddate.

Так как значение типа smalldatetime имеет точность до минуты, то при использовании в аргументах startdate и enddate значений типа smalldatetime секунды и миллисекунды у возвращаемых значений всегда равны 0.

Если переменной типа данных date присвоено только значение времени, в качестве недостающей части даты DATEDIFF задает значение по умолчанию: 1900-01-01 . Если переменной типа данных time или date присвоено только значение даты, в качестве недостающей части времени DATEDIFF задает значение по умолчанию: 00:00:00 . Если в одном из аргументов startdate или enddate указано только время, а в другом только дата, в качестве недостающей информации DATEDIFF задает значения по умолчанию.

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

Границы, задаваемые аргументом datepart

Приведенные ниже инструкции имеют одинаковые значения аргументов startdate и enddate. Указанные даты являются соседними, а временная разница между ними составляет 100 наносекунд (0,0000001 секунды). Разница между аргументами startdate и enddate в каждой инструкции пересекает одну календарную или временную границу аргумента datepart. Каждое выражение возвращает значение 1.

SELECT DATEDIFF(year, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000'); SELECT DATEDIFF(quarter, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000'); SELECT DATEDIFF(month, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000'); SELECT DATEDIFF(dayofyear, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000'); SELECT DATEDIFF(day, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000'); SELECT DATEDIFF(week, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000'); SELECT DATEDIFF(weekday, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000'); SELECT DATEDIFF(hour, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000'); SELECT DATEDIFF(minute, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000'); SELECT DATEDIFF(second, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000'); SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000'); SELECT DATEDIFF(microsecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000'); 

Если аргументы startdate и enddate имеют разные значения года, но одинаковые значения календарной недели, DATEDIFF вернет 0 для части week аргумента datepart.

Замечания

Используйте DATEDIFF в предложениях SELECT , WHERE , HAVING , GROUP BY и ORDER BY .

Функция DATEDIFF неявно приводит строковые литералы к типу datetime2. Это означает, что DATEDIFF не поддерживает формат ГЧМ (год, число, месяц) при передаче даты в виде строки. Для использования формата ГЧМ (год, число, месяц) необходимо явно привести строку к типу datetime или smalldatetime.

Указание SET DATEFIRST не влияет на DATEDIFF . DATEDIFF всегда считает воскресенье первым днем недели, чтобы обеспечить детерминизм работы функции.

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

Примеры

В этих примерах выражения различного типа используются в качестве аргументов для параметров startdate и enddate.

А. Указание столбцов в качестве начальной и конечной даты

В этом примере подсчитывается количество границ дней, пересекаемых между датами в двух столбцах таблицы.

CREATE TABLE dbo.Duration (startDate datetime2, endDate datetime2); INSERT INTO dbo.Duration(startDate, endDate) VALUES ('2007-05-06 12:10:09', '2007-05-07 12:10:09'); SELECT DATEDIFF(day, startDate, endDate) AS 'Duration' FROM dbo.Duration; -- Returns: 1 

B. Указание определенных пользователем переменных в качестве начальной и конечной даты

В этом примере в качестве аргументов startdate и enddate выступают определенные пользователем переменные.

DECLARE @startdate DATETIME2 = '2007-05-05 12:10:09.3312722'; DECLARE @enddate DATETIME2 = '2007-05-04 12:10:09.3312722'; SELECT DATEDIFF(day, @startdate, @enddate); 

C. Указание скалярных системных функций в качестве начальной и конечной даты

В этом примере в качестве аргументов startdate и enddate выступают скалярные системные функции.

SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME()); 

D. Указание скалярных вложенных запросов и скалярных функций в качестве начальной и конечной даты

В этом примере в качестве аргументов startdate и enddate выступают скалярные вложенные запросы.

USE AdventureWorks2022; GO SELECT DATEDIFF(day, (SELECT MIN(OrderDate) FROM Sales.SalesOrderHeader), (SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader)); 

Д. Указание констант в качестве начальной и конечной даты

В этом примере в качестве аргументов startdate и enddate используются символьные константы.

SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', '2007-05-08 09:53:01.0376635'); 

F. Указание числовых выражений и скалярных системных функций в качестве конечной даты

В этом примере в качестве аргументов для enddate используются числовое выражение (GETDATE() + 1) и скалярные системные функции GETDATE и SYSDATETIME .

USE AdventureWorks2022; GO SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635', GETDATE() + 1) AS NumberOfDays FROM Sales.SalesOrderHeader; GO USE AdventureWorks2022; GO SELECT DATEDIFF( day, '2007-05-07 09:53:01.0376635', DATEADD(day, 1, SYSDATETIME()) ) AS NumberOfDays FROM Sales.SalesOrderHeader; GO 

G. Указание ранжирующих функций в качестве начальной даты

В этом примере в качестве аргумента startdate. используется ранжирующая функция.

USE AdventureWorks2022; GO SELECT p.FirstName, p.LastName ,DATEDIFF(day, ROW_NUMBER() OVER (ORDER BY a.PostalCode), SYSDATETIME()) AS 'Row Number' FROM Sales.SalesPerson s INNER JOIN Person.Person p ON s.BusinessEntityID = p.BusinessEntityID INNER JOIN Person.Address a ON a.AddressID = p.BusinessEntityID WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0; 

H. Указание агрегатной оконной функции в качестве начальной даты

В этом примере в качестве аргумента startdate используется агрегатная оконная функция.

USE AdventureWorks2022; GO SELECT soh.SalesOrderID, sod.ProductID, sod.OrderQty, soh.OrderDate, DATEDIFF(day, MIN(soh.OrderDate) OVER(PARTITION BY soh.SalesOrderID), SYSDATETIME()) AS 'Total' FROM Sales.SalesOrderDetail sod INNER JOIN Sales.SalesOrderHeader soh ON sod.SalesOrderID = soh.SalesOrderID WHERE soh.SalesOrderID IN(43659, 58918); GO 

I. Определение разницы между startdate и enddate в виде строковых компонентов даты

-- DOES NOT ACCOUNT FOR LEAP YEARS DECLARE @date1 DATETIME, @date2 DATETIME, @result VARCHAR(100); DECLARE @years INT, @months INT, @days INT, @hours INT, @minutes INT, @seconds INT, @milliseconds INT; SET @date1 = '1900-01-01 00:00:00.000' SET @date2 = '2018-12-12 07:08:01.123' SELECT @years = DATEDIFF(yy, @date1, @date2) IF DATEADD(yy, -@years, @date2) < @date1 SELECT @years = @years-1 SET @date2 = DATEADD(yy, -@years, @date2) SELECT @months = DATEDIFF(mm, @date1, @date2) IF DATEADD(mm, -@months, @date2) < @date1 SELECT @months=@months-1 SET @date2= DATEADD(mm, -@months, @date2) SELECT @days=DATEDIFF(dd, @date1, @date2) IF DATEADD(dd, -@days, @date2) < @date1 SELECT @days=@days-1 SET @date2= DATEADD(dd, -@days, @date2) SELECT @hours=DATEDIFF(hh, @date1, @date2) IF DATEADD(hh, -@hours, @date2) < @date1 SELECT @hours=@hours-1 SET @date2= DATEADD(hh, -@hours, @date2) SELECT @minutes=DATEDIFF(mi, @date1, @date2) IF DATEADD(mi, -@minutes, @date2) < @date1 SELECT @minutes=@minutes-1 SET @date2= DATEADD(mi, -@minutes, @date2) SELECT @seconds=DATEDIFF(s, @date1, @date2) IF DATEADD(s, -@seconds, @date2) < @date1 SELECT @seconds=@seconds-1 SET @date2= DATEADD(s, -@seconds, @date2) SELECT @milliseconds=DATEDIFF(ms, @date1, @date2) SELECT @result= ISNULL(CAST(NULLIF(@years,0) AS VARCHAR(10)) + ' years,','') + ISNULL(' ' + CAST(NULLIF(@months,0) AS VARCHAR(10)) + ' months,','') + ISNULL(' ' + CAST(NULLIF(@days,0) AS VARCHAR(10)) + ' days,','') + ISNULL(' ' + CAST(NULLIF(@hours,0) AS VARCHAR(10)) + ' hours,','') + ISNULL(' ' + CAST(@minutes AS VARCHAR(10)) + ' minutes and','') + ISNULL(' ' + CAST(@seconds AS VARCHAR(10)) + CASE WHEN @milliseconds >0 THEN '.' + CAST(@milliseconds AS VARCHAR(10)) ELSE '' END + ' seconds','') SELECT @result 
118 years, 11 months, 11 days, 7 hours, 8 minutes and 1.123 seconds 

Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)

В этих примерах выражения различного типа используются в качестве аргументов для параметров startdate и enddate.

J. Указание столбцов в качестве начальной и конечной даты

В этом примере подсчитывается количество границ дней, пересекаемых между датами в двух столбцах таблицы.

CREATE TABLE dbo.Duration (startDate datetime2, endDate datetime2); INSERT INTO dbo.Duration (startDate, endDate) VALUES ('2007-05-06 12:10:09', '2007-05-07 12:10:09'); SELECT TOP(1) DATEDIFF(day, startDate, endDate) AS Duration FROM dbo.Duration; -- Returns: 1 

K. Указание скалярных вложенных запросов и скалярных функций в качестве начальной и конечной даты

В этом примере в качестве аргументов startdate и enddate выступают скалярные вложенные запросы.

-- Uses AdventureWorks SELECT TOP(1) DATEDIFF(day, (SELECT MIN(HireDate) FROM dbo.DimEmployee), (SELECT MAX(HireDate) FROM dbo.DimEmployee)) FROM dbo.DimEmployee; 

L. Указание констант в качестве начальной и конечной даты

В этом примере в качестве аргументов startdate и enddate используются символьные константы.

-- Uses AdventureWorks SELECT TOP(1) DATEDIFF(day, '2007-05-07 09:53:01.0376635', '2007-05-08 09:53:01.0376635') FROM DimCustomer; 

M. Указание ранжирующих функций в качестве начальной даты

В этом примере в качестве аргумента startdate. используется ранжирующая функция.

-- Uses AdventureWorks SELECT FirstName, LastName, DATEDIFF(day, ROW_NUMBER() OVER (ORDER BY DepartmentName), SYSDATETIME()) AS RowNumber FROM dbo.DimEmployee; 

О. Указание агрегатной оконной функции в качестве начальной даты

В этом примере в качестве аргумента startdate используется агрегатная оконная функция.

-- Uses AdventureWorks SELECT FirstName, LastName, DepartmentName, DATEDIFF(year, MAX(HireDate) OVER (PARTITION BY DepartmentName), SYSDATETIME()) AS SomeValue FROM dbo.DimEmployee 

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

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

MySQL предоставляет возможность сравнивать различные даты между собой, или с каким-то определенным выражением. В этой статье мы обсудим, как работать с датой в Mysql, как из сравнивать и строить запросы с учетом дат.

Когда вам нужно сравнить дату какого-то столбца с произвольной датой, вы можете использовать функцию DATE() , которая извлекает дату из переданного аргумента (без учета времени) и сравнить ее со строкой нужной вам даты.

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

Например, предположим, что у вас есть таблица MySQL под названием users со следующими строками:

mysql> SELECT * FROM users; +---------+------------+-----------+---------------------+ | user_id | first_name | last_name | last_update | +---------+------------+-----------+---------------------+ | 201 | Peter | Parker | 2021-08-01 16:15:00 | | 202 | Thor | Odinson | 2021-08-02 12:15:00 | | 204 | Loki | Laufeyson | 2021-08-03 10:43:24 | +---------+------------+-----------+---------------------+ 3 rows in set (0.00 sec) 

Теперь вам нужно выбрать все строки из таблицы users , у которых значение last_update больше 2021-08-01 .

И это достаточно просто сделать:

SELECT user_id, first_name, last_name, last_update FROM users WHERE DATE(last_update) > "2021-08-01" ORDER BY last_update ASC 

Результат запроса выше будет следующим:

+---------+------------+-----------+---------------------+ | user_id | first_name | last_name | last_update | +---------+------------+-----------+---------------------+ | 202 | Thor | Odinson | 2021-08-02 12:15:00 | | 204 | Loki | Laufeyson | 2021-08-03 10:43:24 | +---------+------------+-----------+---------------------+ 2 rows in set (0.00 sec) 

При сравнении столбца типа DATETIME или TIMESTAMP с датой в виде строки (как в запросе выше), MySQL автоматически преобразует значения к единому формату для сравнения и веронет подходящзие результаты.

Чтобы проверить результат запроса добавим оператор ORDER BY в приведенный выше запрос.

Вы можете сразу определить, удовлетворяет ли запрос вашему требованию, взглянув на первую строку. Как и в приведенном выше примере, самое раннее значение столбца last_update должно быть 2021-08-02 .

Вы также можете использовать оператор BETWEEN , чтобы выбрать все строки, в которых столбец даты находится между двумя указанными выражениями даты:

SELECT user_id, first_name, last_name, last_update FROM users WHERE BETWEEN "2021-08-01" AND "2021-08-02" ORDER BY last_update ASC 

Приведенный выше запрос выведет следующий результат:

+---------+------------+-----------+---------------------+ | user_id | first_name | last_name | last_update | +---------+------------+-----------+---------------------+ | 201 | Peter | Parker | 2021-08-01 16:15:00 | | 202 | Thor | Odinson | 2021-08-02 12:15:00 | +---------+------------+-----------+---------------------+ 2 rows in set (0.00 sec) 

НО! MySQL допускает только один формат даты: yyyy-mm-dd , поэтому вам нужно форматировать любое строковое выражение даты по которым вы хотите выбирать данные к нужному формату.

Зачем использовать функцию DATE() для сравнения дат

Функция MySQL DATE() извлекает часть даты из столбца DATETIME или TIMESTAMP и приводит её к формату строки, как показано ниже:

mysql> SELECT DATE('2005-08-28 01:02:03'); -> '2005-08-28' 

Эта функция используется для того, чтобы MySQL использовал для сравнения только часть даты вашего столбца, без учета времени.

Если не использовать функцию DATE() , то MySQL также будет сравнивать и время столбца с вашим строковым выражением. Таким образом, результатом будут записи, полностью совпадаюащие до секунды.

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

SELECT user_id, first_name, last_name, last_update FROM users WHERE last_update > "2021-08-01" ORDER BY last_update ASC 

Вернет такие результаты:

+---------+------------+-----------+---------------------+ | user_id | first_name | last_name | last_update | +---------+------------+-----------+---------------------+ | 201 | Peter | Parker | 2021-08-01 16:15:00 | | 202 | Thor | Odinson | 2021-08-02 12:15:00 | | 204 | Loki | Laufeyson | 2021-08-03 10:43:24 | +---------+------------+-----------+---------------------+ 3 rows in set (0.01 sec) 

Как видно из результатов, условие сравнения last_update > «2021-08-01» становится last_update > «2021-08-01 00:00:00» , и MySQL возвращает соответствующий набор результатов.

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

Следующий запрос из той же таблицы:

SELECT user_id, first_name, last_name, last_update FROM users WHERE last_update > "2021-08-01 20:00:00" ORDER BY last_update ASC 

Даст следующий результат:

+---------+------------+-----------+---------------------+ | user_id | first_name | last_name | last_update | +---------+------------+-----------+---------------------+ | 202 | Thor | Odinson | 2021-08-02 12:15:00 | | 204 | Loki | Laufeyson | 2021-08-03 10:43:24 | +---------+------------+-----------+---------------------+ 2 rows in set (0.00 sec) 

Сравнение дат между двумя столбцами дат

Если у вас уже есть два столбца даты, то вы можете сразу же сравнить их с помощью операторов < , = , > или BETWEEN .

Предположим, что в вашей таблице есть столбцы last_update и last_login , как показано ниже:

+---------+------------+-----------+---------------------+---------------------+ | user_id | first_name | last_name | last_update | last_login | +---------+------------+-----------+---------------------+---------------------+ | 201 | Peter | Parker | 2021-08-01 16:15:00 | 2021-08-17 10:00:00 | | 202 | Thor | Odinson | 2021-08-02 12:15:00 | 2021-08-02 08:00:00 | | 204 | Loki | Laufeyson | 2021-08-03 10:43:24 | 2021-08-10 06:00:00 | +---------+------------+-----------+---------------------+---------------------+ 

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

SELECT user_id, first_name, last_name, last_update FROM users WHERE last_login > last_update ORDER BY last_update ASC 

Результат будет следующим:

+---------+------------+-----------+---------------------+---------------------+ | user_id | first_name | last_name | last_update | last_login | +---------+------------+-----------+---------------------+---------------------+ | 204 | Loki | Laufeyson | 2021-08-03 10:43:24 | 2021-08-10 06:00:00 | | 201 | Peter | Parker | 2021-08-01 16:15:00 | 2021-08-17 10:00:00 | +---------+------------+-----------+---------------------+---------------------+ 2 rows in set (0.00 sec) 

Вот каким образом вы можете выполнять сравнение дат в MySQL.

Не забудьте, что вам нужно иметь строковое выражение даты, отформатированное как yyyy-mm-dd или yyyy-mm-dd hh:mm:ss , если вы хотите сравнить и временную часть.

Выбор дат за определнный интервал

Очень часто приходится выбирать записи с датой за определнный интервал. Для этих целей в MySql существуют встроенная функции INTERVAL , упрощающая работу с датами за определенный период.

Например, для того, чтобы выбрать записи, обновленные за последний год, выполним запрос:

SELECT user_id, first_name, last_name, last_update FROM users WHERE last_login > CURDATE() - INTERVAL 1 YEAR ORDER BY last_update ASC 

При том, что INTERVAL может работать с различными интервалами времени:

  • SECOND — секунды
  • MINUTE — минуты
  • HOUR — часы
  • DAY — дни
  • MONTH — месяцы
  • YEAR — года

Те же самые действия применимы и к UPDATE-операциям:

UPDATE users SET last_update = CURDATE() - INTERVAL 10 DAY WHERE >

Резюме

В этой статье поговорили про работу с датами в Mysql. Как можно выбрать даты определенной даты, или по указанному интервалу. А так же, как работать с колонками дат разных типов.

Если вы хотите поупражняться с запросами, то вот вам демонстрационная таблица:

CREATE TABLE `users` ( `user_id` smallint unsigned NOT NULL AUTO_INCREMENT, `first_name` varchar(45) NOT NULL, `last_name` varchar(45) NOT NULL, `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `last_login` timestamp NULL DEFAULT NULL, PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; INSERT INTO `users` (`user_id`, `first_name`, `last_name`, `last_update`, `last_login`) VALUES (201,'Peter','Parker','2021-08-01 16:15:00','2021-08-17 10:00:00'), (202,'Thor','Odinson','2021-08-02 12:15:00','2021-08-02 08:00:00'), (204,'Loki','Laufeyson','2021-08-03 10:43:24','2021-08-10 06:00:00'); 

В серці. Назавжди.

В серці. Назавжди.

Вчора у мене помер однокласник. А сьогодні бабуся. І хто б міг уявити, що цей рік принесе війну, смерть товариша, та смерть члена сім’ї? Це боляче. Проте це добре нагадування про те, як швидко тече час. І як його ціна збільшується кожної марно витраченої секунди. І я не скажу щось

20 мая 2022 г. 1 min read

Ось такий він, руський мир

Ось такий він, руський мир

«Руський мир» — звучить дуже сильно та виправдовуюче. Гарна обгортка виправдання слабкості, аморальності та нікчемності своїх дійсних намірів. Руський мир, який дуже солодко звучить для всіх, хто хоче закрити очі на факт повномасштабної війни. Дуже добре виправдання вбивства для купки звірів. Втім, це ж росія, в якій все виглядає логічно

16 апр. 2022 г. 3 min read

Перехват запросов и ответов JavaScript Fetch API

Перехват запросов и ответов JavaScript Fetch API

Перехватчики — это блоки кода, которые вы можете использовать для предварительной или последующей обработки HTTP-вызовов, помогая в обработке глобальных ошибок, аутентификации, логирования, изменения тела запроса и многом другом. В этой статье вы узнаете, как перехватывать вызовы JavaScript Fetch API. Есть два типа событий, для которых вы можете захотеть перехватить HTTP-вызовы:

Как сравнивать даты в 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. Больше подробностей — в нашем Пользовательском соглашении.

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

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