日期间隔错误

时间:2014-10-27 18:21:42

标签: mysql

我有一个表有一个名为created DATETIME的列,当添加条目时工作正常,但当它到达日期间隔时,它会不断复制新条目。我试图获得今天和昨天的参赛作品。今天的工作正常,但对于昨天,它还在查询结果中提供了今天的内容,这不是我想要的。

SELECT * FROM tab WHERE created > DATE_SUB(NOW(), INTERVAL $num DAY) ORDER BY created DESC LIMIT 9;

$num今天的参赛作品为1,而昨天的作品为2。所以基本上是今天创建的一个条目,在昨天的查询结果中得到重复。

2 个答案:

答案 0 :(得分:2)

您将从数据库中获得所请求的结果。即任何大于今天的记录减去你投入的许多天。

当您尝试@ KenWhite建议将>更改为=时,您获得0条记录的原因是因为您的字段为DATETIME,因此从NOW()收到的时间恰好减去24小时昨天的确切时间相同,你可能没有一张昨天正好写的记录。正确?

您需要做的是测试两个日期之间的记录以满足您的需求。而不是NOW(),切换到CURDATE(),这样您就可以确保获得所需日期时间范围的所有记录。

SELECT *
FROM tab
WHERE 
  created BETWEEN DATE_SUB(CURDATE(), INTERVAL $num DAY) AND DATE_SUB(CURDATE(), INTERVAL $num - 1 DAY) 
ORDER BY created DESC LIMIT 9;

你可以在这里查看一个SQLFiddle:http://sqlfiddle.com/#!2/19d9b/12

答案 1 :(得分:0)

使用datetime / timestamp值(类似于浮点数),始终使用具有封闭开头和开放结尾的范围。所以使用'> ='和'<'。

例如,使用一天的数据:

SELECT ... FROM tab 
WHERE created >= CURDATE() - INTERVAL @num:=? DAY
  AND created <  CURDATE() - INTERVAL @num    DAY + INTERVAL 1 DAY
ORDER BY created DESC
LIMIT 9
;

对于MySQL,通常更喜欢timestamp类型而不是datetime类型,因为datetime不包含时区信息。

备选方案:

created_at timestamp NULL DEFAULT NULL COMMENT 'set by application',

created_at timestamp NOT NULL DEFAULT '1970-01-01 23:00:00' COMMENT 'set by application',

dbms_row_created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'set by DBMS',