2014-10-27 179 views
0

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

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

$num对于今天的条目是1,而对于昨天的条目是2。所以基本上是今天创建的条目,在昨天的查询结果上得到重复。

+2

您使用大于('>'),这意味着它会检索所有行'created'是*不是*指定的日期。你为什么期望它有不同的表现?如果您指定NOW()减去昨天的天数,则今天创建的行的创建日期*将大于*昨天,并将包含在内。将'>'更改为'='。 – 2014-10-27 18:29:58

+0

@KenWhite现在它甚至不会返回任何东西。 – 111WARLOCK111 2014-10-27 18:35:01

回答

2

您正在从数据库中获取您要求的结果。即是大于今天然而,许多减去天的任何记录你插嘴说。

的原因,你得到0的记录,当您尝试@ KenWhite的建议改变你的>=是因为你的字段是DATETIME,所以减去正好24小时从NOW()产生的时间与昨天相同,并且您可能没有昨天此刻准确记录的记录。对?

你需要做的是测试两个日期之间的记录,以得到你想要的。取而代之的是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

0

随着日期时间/时间戳值,类似于浮动,始终使用封闭的开头和结尾开放范围。所以使用'> ='和'<'。

例如使用单一的一天的数据:

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,一般喜欢在日期时间类型的时间戳类型,日期时间不携带时区信息。

替代方案:

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',