2014-07-14 47 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不能在这种情况下使用索引。