2014-07-14 6 views
4

Мне нужно проверить записи, сделанные в последние дни «x» (пример 30 дней), и не может заставить запрос работать. Это то, что я использую:Неисправность в диапазонах дат

SELECT CAL_OWNER, 
      CAL_TITLE, 
      FROM_UNIXTIME (CAL_CREATED, "%m-%d-%y") AS CREATED, 
      FROM_UNIXTIME (RANGE_START, "%Y-%m-%d") AS DATE2BESEEN, 
      CASE CAL_REFERRAL_TYPE 
       WHEN 1 THEN 'NoReferral' 
       WHEN 2 THEN 'CareyGuide' 
       WHEN 3 THEN 'Education' 
       WHEN 4 THEN 'Employment' 
       WHEN 5 THEN 'Housing' 
       WHEN 6 THEN 'Medical' 
       ELSE 'NA' 
      END 
       AS REFERRALS 
    FROM EGW_CAL 
    WHERE CAL_CREATED BETWEEN (NOW() - '30 day') AND NOW() 
ORDER BY REFERRALS ASC; 

Если я закомментировать «ГДЕ RANGE_START ... линия запрос работает нормально, но тянет все данные Однако, если я запускаю полный запрос, это не ошибка, но результатов нет (у меня есть 4 записей в столбце cal_created в течение последних 3-х недель).

Если кто-то может помочь я действительно ценю это

ответ

1

Попробуйте использовать ИНТЕРВАЛ и как NOW() или CurDate () ..

WHERE FROM_UNIXTIME (CAL_CREATED,'%Y-%m-%d') BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE() 

CURDATE только дата часть дня

, если вы хотите включить использование времени NOW()

WHERE FROM_UNIXTIME (CAL_CREATED,'%Y-%m-%d') BETWEEN NOW() - INTERVAL 30 DAY AND NOW() 

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

WHERE FROM_UNIXTIME (CAL_CREATED,'%Y-%m-%d') BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW() 

ИСТОЧНИК: http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html

Примечание: даты должны быть formatte d правильно для того, чтобы работать


ПОЛНЫЙ ЗАПРОС:

SELECT 
    CAL_OWNER, 
    CAL_TITLE, 
    FROM_UNIXTIME (CAL_CREATED, '%m-%d-%y') AS CREATED_AT, 
    FROM_UNIXTIME (RANGE_START, '%Y-%m-%d') AS DATE2BESEEN, 
    CASE CAL_REFERRAL_TYPE 
     WHEN 1 THEN 'NoReferral' 
     WHEN 2 THEN 'CareyGuide' 
     WHEN 3 THEN 'Education' 
     WHEN 4 THEN 'Employment' 
     WHEN 5 THEN 'Housing' 
     WHEN 6 THEN 'Medical' 
     ELSE 'NA' 
    END AS REFERRALS 
FROM EGW_CAL 
WHERE FROM_UNIXTIME(CAL_CREATED,'%Y-%m-%d') BETWEEN (NOW() - INTERVAL 30 DAY) AND NOW() 
ORDER BY REFERRALS ASC; 
+0

Когда я использую любое из 3, я получаю это, это не ошибка, но в результате MySQL возвращает пустой набор результатов (т. Е. Нулевые строки). (Query took 0.0077 сек) – Detox

+0

@Detox Вы пытались CURDATE()? –

+0

@Detox не уверен, как NOW() выдает ошибку ... я добавил ссылку в свой ответ. попробуйте использовать другой формат даты .. см. мой отредактированный ответ –

0

Правильное положение where использует internval:

WHERE CAL_CREATED BETWEEN NOW() - interval 30 day AND NOW() 

Использование одиночных кавычек напоминает Postgres. В MySQL он обрабатывает значение now() как целое число. И он вычитает из него строковое значение «30 дней».

Когда now() рассматривается как целое число, он также имеет часы, минуты и секунды. Таким образом, вы действительно вычитаете что-то вроде 30 секунд. Here - это документация по адресу now().

+0

Синтаксис, определенный стандартом SQL, будет 'interval '30' day' с только фактическое значение, помещенное в одинарные кавычки - я никогда не понимал, почему руководство Postgres (по-прежнему) предпочитает нестандартный синтаксис –

+0

@gordon, когда я использую ГДЕ cal_created МЕЖДУ СЕЙЧАС() - интервал 30 дней И СЕЙЧАС() ЗАКАЗАТЬ рефералами ASC Я получаю следующую ошибку: # 1630 - FUNCTION egwdata.NOW не существует. Проверьте раздел «Разбор и разрешение имен функций» в Справочном руководстве – Detox

+0

Во-первых, между 'NOW' и'() 'не должно быть пробела (я случайно оставил это в вашем вопросе). Во-вторых, если у вас нет функции 'NOW()', то вы не используете MySQL, и вы должны задать вопрос. (Или, еще лучше, задайте новый вопрос, потому что у этого вопроса уже есть ответы, которые, вероятно, будут признаны недействительными.) –

1
  • CAL_CREATED является метка времени UNIX,
  • NOW() возвращает временную метку MySQL.

Они не смешиваются автоматически. Так что используйте

WHERE CAL_CREATED 
    BETWEEN UNIX_TIMESTAMP(NOW() - INTERVAL 30 DAY) AND UNIX_TIMESTAMP(NOW()); 

Примечание:

Я не рекомендовал бы пойти другим путем

WHERE FROM_UNIXTIME(CAL_CREATED) BETWEEN ... 

потому, что MySQL не может использовать индекс в этом случае.

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