В SQL как сравнивать значения дат?

Используя синтаксис MySQL и имея таблицу со строкой вроде:

mydate DATETIME NULL,

Есть ли способ сделать что-то вроде:

... WHERE mydate<='2008-11-25';

Я пытаюсь, но не могу заставить его работать.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
15
0
131 924
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Nevermind нашел ответ. То же самое для всех, кто был готов ответить.

WHERE DATEDIFF(mydata,'2008-11-20') >=0;

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

Joel Coehoorn 25.11.2008 23:10

Эээ, WHERE mydate<='2008-11-25'является способ сделать это. Это должно сработать.

Вы получаете сообщение об ошибке? Вы используете старую версию MySQL?

Обновлено: следующее отлично работает для меня в MySQL 5.x

create temporary table foo(d datetime);
insert into foo(d) VALUES ('2000-01-01');
insert into foo(d) VALUES ('2001-01-01');
select * from foo where d <= '2000-06-01';

На моей СУБД PostgreSQL действительно работает нормально. Может быть слабое место MySQL?

bortzmeyer 26.11.2008 11:13

Эээ, это тоже работает с MySQL. :) Я просто попробовал убедиться, что не чокнутый. Какую версию MySQL вы используете fmfs? Вы получаете сообщение об ошибке?

Eli 26.11.2008 19:17

В стандартном синтаксисе SQL вы должны использовать:

WHERE mydate <= DATE '2008-11-20'

То есть ключевое слово DATE должно предшествовать строке. В некоторых СУБД, однако, не нужно быть таким явным; система автоматически преобразует столбец DATE в строку или строку в значение DATE. Формально есть некоторые интересные последствия, если ДАТА преобразована в строку - если у вас есть даты в первом тысячелетии (0001-01-01 .. 0999-12-31), и начальные нули опущены система форматирования.

Обратите внимание: если все даты указаны в формате ISO 8601, как показано, сравнения строк будут работать (это функция ISO 8601).

bortzmeyer 26.11.2008 11:12

Если начальные нули включены, да. Теоретически, если у вас есть даты до 01.01.1000, СУБД может опустить начальные нули. Не уверен, что это очень вероятно, но известны и более забавные вещи. Oracle поддерживает даты BCE (BC); они не могут быть надежно сопоставлены как строки.

Jonathan Leffler 26.11.2008 20:56

Вы можете добавить компонент времени

WHERE mydate<='2008-11-25 23:59:59'

но это может не сработать в даты перехода на летнее время, если mydate - '2008-11-25 24:59:59', поэтому, вероятно, безопаснее всего захватить все до следующей даты:

WHERE mydate < '2008-11-26 00:00:00'

Ваша проблема может заключаться в том, что вы имеете дело с данными DATETIME, а не только с датами. Если у строки есть mydate «2008-11-25 09:30 AM», то ваш ГДЕ mydate <= '2008-11-25'; не вернет эту строку. «2008-11-25» подразумевает время 00:00 (полночь), поэтому, хотя часть даты одинакова, они не равны, а mydate больше.

Если вы используете <'2008-11-26' вместо <= '2008-11-25', это сработает. Метод Datediff работает, потому что он сравнивает только часть даты и игнорирует время.

Другие вопросы по теме