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

Использование синтаксиса MySQL и наличие таблицы со строкой типа:

mydate DATETIME NULL,

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

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

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

Ответ 1

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

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

Ответ 2

Uh, 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';

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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