В SQL как сравнивать значения даты? - PullRequest
11 голосов
/ 25 ноября 2008

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

mydate DATETIME NULL,

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

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

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

Ответы [ 5 ]

19 голосов
/ 26 ноября 2008

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

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

Edit: у меня на 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';
9 голосов
/ 25 ноября 2008

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

WHERE DATEDIFF(mydata,'2008-11-20') >=0;
7 голосов
/ 26 ноября 2008

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

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

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

1 голос
/ 26 ноября 2008

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

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

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

WHERE mydate < '2008-11-26 00:00:00'
0 голосов
/ 26 ноября 2008

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

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

...