2012-03-14 3 views
2

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

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

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

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

b. Я использую синтаксис corret, чтобы убедиться, что мы включили все нулевые опции?

Обновление.

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

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

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

Решение.

Во-первых, я изменил тип столбца на DATE (из VARCHAR).

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

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

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

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

Thankyou @nnicholas и все.

+1

Вы должны начать с хранения ваших дат в полях типа DATE. Ваша жизнь будет намного легче. – nnichols

+1

Ваши даты хранятся как varchar или что-то еще? стандартный формат даты будет yyyy-MM-dd –

+0

это действительно varchar –

ответ

5

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

-- 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 должен быть в формате Y-м-д.

+0

Хорошо, я внес эти изменения, но все же, я получаю слишком много результатов для моего запроса ... :( –

+0

Теперь все в лучшем месте, чтобы помочь. Что именно вы хотите вернуть? – nnichols

+0

Вы хотите все записи, где дата равна либо NULL, либо BETWEEN (input_date - 2 года) AND (input_date + 2 года)? – nnichols

1

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

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

И он должен работать, как ожидалось.

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

UPDATE

Кажется, я ошибся в полагая, что date колонна была date типа. @James C has got the point, as well as @nnichols, и их предложение об изменении типа столбца кажется для вас в вашей ситуации.

+0

Я добавил это, но он все еще дает мне все результаты .. :( –

+1

@LucyWeatherford: предложение Джеймса C похоже на то, чтобы пойти за вами. В настоящее время вам нужно будет заменить все вхождения 'date' в ваш запрос с чем-то вроде «STR_TO_DATE (дата,«% m /% d /% Y »)», но в будущем эта же операция должна выполняться на этапе получения/импорта данных в эту таблицу, а также «date» 'column должен быть тип' date', конечно. –

+0

okay, я буду реализовывать это, спасибо! –

2

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

Вы можете сделать что-то очень уродливое, отбрасывая его до даты с 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 даты 2012-03-14 (для 14-го марта 2012 г.)

+1

Это будет работать, но стоимость преобразования строки в дату для каждой строки всякий раз, когда вам нужно провести какое-либо сравнение дат – nnichols

+0

Я согласен, это ужасно неэффективно. Вот почему я предложил переделать столбец в тип 'DATE' :) –

+0

Скобки вокруг части' OR' все равно понадобятся. –

1

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

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

+0

Я не думаю, что это сработало бы так же, как строка 'mm/dd/yyyy' - это не то, что MySQL может анализировать. Вы должны использовать что-то вроде 'STR_TO_DATE()' для разбора странного формата и возврата объекта 'DATE' –

+0

@Ben это не мои фактические имена, я не называю таблицу« table »либо ... Спасибо для совета youh, я преобразовываю столбец даты к фактическому типу даты. –

Смежные вопросы