2014-07-14 105 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; 

如果我註釋掉「WHERE RANGE_START ...行查詢運行正常,但拉的所有數據 但是,如果我運行了完整的查詢,它沒有錯誤,但目前還沒有結果(我已經在過去的3周cal_created列4項)。

如果有人可以幫助我真的很感激它

回答

1

嘗試使用間隔,要麼NOW()或CURDATE( )..

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

CURDATE僅僅是一天的日期部分

,如果你想現在包括使用時間()

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 ð正確,以便它的工作


完整的查詢:

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的結果返回了一個空的結果集(即零行)。 (查詢耗時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秒。 Herenow()的文檔。

+0

SQL標準定義的語法爲'interval'30'day',只有實際價值放在單引號 - 我從來沒有明白爲什麼Postgres手冊(仍然)更喜歡非標準語法 –

+0

@戈登當我使用 WHERE cal_created BETWEEN NOW() - 間隔30天和NOW() ORDER BY引用ASC我收到以下錯誤:#1630 - 功能egwdata.NOW不存在。檢查參考手冊 – Detox

+0

中的'Function Name Parsing and Resolution'部分首先,'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不能在這種情況下使用索引。