不,您不能对TIMESTAMP、DATETIME 和其他与日期相关的数据类型隐式使用整数运算。您正在考虑 UNIX 时间戳格式,它是自 1970 年 1 月 1 日以来的整数秒数。
您可以在 MySQL 中将 SQL 数据类型转换为 UNIX timestamp,然后使用算术:
SELECT * FROM posts WHERE UNIX_TIMESTAMP(dateposted)+604800 > NOW()+0;
注意:将零添加到 NOW() 使其返回数值而不是字符串值。
更新:好的,我对上面的查询完全错误。将NOW() 转换为数字输出不会产生可以与 UNIX 时间戳进行比较的数字。它产生一个数字,但该数字不计算秒数或其他任何东西。这些数字只是 YYYYMMDDHHMMSS 串在一起。
例子:
CREATE TABLE foo (
id SERIAL PRIMARY KEY,
dateposted TIMESTAMP
);
INSERT INTO foo (dateposted) VALUES ('2009-12-4'), ('2009-12-11'), ('2009-12-18');
SELECT * FROM foo;
+----+---------------------+
| id | dateposted |
+----+---------------------+
| 1 | 2009-12-04 00:00:00 |
| 2 | 2009-12-11 00:00:00 |
| 3 | 2009-12-18 00:00:00 |
+----+---------------------+
SELECT *, UNIX_TIMESTAMP(dateposted) AS ut, NOW()-604800 AS wk FROM foo
+----+---------------------+------------+-----------------------+
| id | dateposted | ut | wk |
+----+---------------------+------------+-----------------------+
| 1 | 2009-12-04 00:00:00 | 1259913600 | 20091223539359.000000 |
| 2 | 2009-12-11 00:00:00 | 1260518400 | 20091223539359.000000 |
| 3 | 2009-12-18 00:00:00 | 1261123200 | 20091223539359.000000 |
+----+---------------------+------------+-----------------------+
很明显,数值是不可比较的。但是,UNIX_TIMSTAMP() 也可以转换该格式的数值,因为它可以转换时间戳的字符串表示形式:
SELECT *, UNIX_TIMESTAMP(dateposted) AS ut, UNIX_TIMESTAMP(NOW())-604800 AS wk FROM foo
+----+---------------------+------------+------------+
| id | dateposted | ut | wk |
+----+---------------------+------------+------------+
| 1 | 2009-12-04 00:00:00 | 1259913600 | 1261089774 |
| 2 | 2009-12-11 00:00:00 | 1260518400 | 1261089774 |
| 3 | 2009-12-18 00:00:00 | 1261123200 | 1261089774 |
+----+---------------------+------------+------------+
现在可以使用比较它们的表达式运行查询:
SELECT * FROM foo WHERE UNIX_TIMESTAMP(dateposted) > UNIX_TIMESTAMP(NOW())-604800
+----+---------------------+
| id | dateposted |
+----+---------------------+
| 3 | 2009-12-18 00:00:00 |
+----+---------------------+
但是@OMGPonies 给出的答案仍然更好,因为我的查询中的这个表达式可能无法使用索引。我只是提供这个来解释TIMESTAMP 和NOW() 功能的工作原理。