MySQL将日期与时间戳进行比较

时间:2011-10-22 13:01:45

标签: mysql

我有一个VARCHAR字段completion_date,其中包含一个时间戳日期(例如1319193919)。是否可以在这样的字段上运行查询,将其与NOW()进行比较?我在尝试:

SELECT * FROM (`surveys`) WHERE `active` = '1' AND `archived` = '0' AND `completion_date` > 'NOW()'

但结果并不是我所期待的,这是VARCHAR的原因吗?如果是这样,我最好使用哪种日期字段?数据必须保持Linux时间戳。

2 个答案:

答案 0 :(得分:3)

使用UNIX_TIMESTAMP()

NOW()转换为时间戳
SELECT * 
FROM (`surveys`) 
WHERE `active` = '1' AND `archived` = '0' AND `completion_date` > UNIX_TIMESTAMP(NOW())

另外,请移除'NOW()'

周围的引号
mysql> SELECT UNIX_TIMESTAMP(NOW());
+-----------------------+
| UNIX_TIMESTAMP(NOW()) |
+-----------------------+
|            1319288622 |
+-----------------------+

N.B。如果您需要它,此函数的反函数为FROM_UNIXTIME(),以将时间戳转换为默认的MySQL DATETIME格式。

如下面的评论中所述,如果您能够进行更改,建议您使用真实DATETIME类型代替VARCHAR()来获取此数据。

答案 1 :(得分:0)

Linux时间戳可以很容易地存储在BIGINT(或UNSIGNED INT)中,这将使您尝试进行的比较类型成为可能。 VARCHAR将进行词法而不是数字比较,这不是你想要的。将BIGINT与NOW() UNIX_TIMESTAMP()结合使用可以得到你想要的结果。

使用DATETIME数据类型存储它甚至可能更好,并在选择数据时进行转换。如果您移动到或添加不适合Linux时间戳的其他平台,将其存储为DATETIME将来会证明您的应用程序。然后,您只需要修改代码,而不是转换数据以使其继续工作。我现在正在开展一个项目,其中日期存储为字符数据,并且将旧数据用于新应用程序的问题一直没有结束,尽管您可能遇到的问题比我们少,因为您存储时间邮票,而不是格式化的日期,以及伴随的拼写错误。