Mysql интервал дат - PullRequest
       8

Mysql интервал дат

2 голосов
/ 14 марта 2012

Я пытаюсь выбрать строки, которые находятся в пределах определенного периода времени:

$sql = mysql_query(" SELECT * FROM table WHERE ... AND 
       date BETWEEN ('$date' - Interval 2 YEAR) AND ('$date' + Interval 2 YEAR)
       OR date ISNULL");

Формат дат, сохраняемых в этом столбце, - мм / дд / гггг

a.как выбрать временной интервал?в настоящее время он выбирает все строки, а не только те, которые находятся в этом диапазоне дат.

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

Обновление.

После ответов и комментариев я изменил тип столбца на «Дата»"(это был varchar), а также изменили текущий тип существующих записей на правильный формат даты.

Теперь у меня есть 2 вопроса: a.Это все еще не работает ... В чем еще может быть проблема?б.Я хочу изменить в PHP, где запись сохраняется.Как я могу пойти по этому поводу?Правильно ли следующее:

 $new_date = mysql_query("STR_TO_DATE($old_date_string,'%m/%d/%Y')");

Решение.

Сначала я изменил тип столбца на DATE (с VARCHAR).

Второй,Я переместил и преобразовал все существующие записи из существующего столбца и типа (str) в новый тип (date) и новый столбец.

В-третьих, я добавил скобки в раздел «date».

В-четвертых, я изменил ISNULL на IS NULL - добавив пробел, который превращает его из функции в оператор.

В-пятых, сейчас я обновляю свой сценарий, чтобы в будущем даты сохранялисьв новый столбец в новом типе, преобразовав их в правильный fprmat перед сохранением их в базе данных.

Спасибо @nnicholas и всем.

Ответы [ 4 ]

6 голосов
/ 14 марта 2012

Если вы действительно храните свои даты в виде строк, я предлагаю вам обновить таблицу следующим образом -

-- add a new column of type DATE
ALTER TABLE `table` ADD COLUMN `date_new` DATE AFTER `date`;
-- populate the new column from the old one
UPDATE `table` SET `date_new` = STR_TO_DATE(`date`,'%m/%d/%Y');
-- drop the old column
ALTER TABLE `table` DROP COLUMN `date`;
-- rename the new column
ALTER TABLE `table` CHANGE `date_new` `date` DATE;

После внесения этих изменений обработка дат будет для вас намного проще.При вставке дат, которые вы получаете, вы просто используете STR_TO_DATE('new_value','%m/%d/%Y') для преобразования даты во время вставки -

mysql_query("INSERT INTO `table` (field1, field2, `date`) 
               VALUES('value1', 'value2', STR_TO_DATE('$old_date_string','%m/%d/%Y')");

Это предполагает, что $ old_date_string уже очищена.

С вашей таблицейСтруктура обновлена, стандартные арифметические функции даты будут работать как положено.

$sql = mysql_query("SELECT *
                    FROM table
                    WHERE ...
                    AND (`date` BETWEEN ('$date' - INTERVAL 2 YEAR) AND ('$date' + INTERVAL 2 YEAR) OR `date` IS NULL)");

$date должен быть в формате Ymd.

2 голосов
/ 14 марта 2012

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

Вы могли бы сделать что-то очень уродливое, приведя его к дате с STR_TO_DATE() и затем сравнив, но яЯ предлагаю изменить структуру таблицы, чтобы сохранить эту дату в качестве объекта DATE.

SELECT * FROM table WHERE ... AND 
    STR_TO_DATE(date, '%m/%d/%Y') BETWEEN ('$date' - Interval 2 YEAR) AND ('$date' + Interval 2 YEAR)
    OR date ISNULL

Предполагается, что $date имеет правильный формат MySQL DATE 2012-03-14 (на 14 марта 2012 г.)

1 голос
/ 14 марта 2012

Вы должны CAST / CONVERT поле даты, которое вы получаете от MySQL (вы действительно называли поле даты 'date'? Это плохая идея).

Лучший ответ - преобразовать столбец даты в фактический тип DATE. Вы также не должны использовать формат mm / dd / yyyy как неоднозначный.

1 голос
/ 14 марта 2012

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

$sql = mysql_query(" SELECT * FROM table WHERE ... AND 
       (
       date BETWEEN ('$date' - Interval 2 YEAR) AND ('$date' + Interval 2 YEAR)
       OR date ISNULL
       )");

И все должно работать как положено.

Помимо пропущенных скобок, ваше состояние кажетсявсе в порядке с NULL (т. е. NULL будут включены в вывод независимо от переданного аргумента).

UPDATE

Кажется, я ошибся, предполагая, чтоСтолбец date был типа date. @ Джеймс С. получил точку , , а также @ nnichols , и их предложение об изменении типа столбца кажется подходящим в вашей ситуации.

...