2011-10-22 163 views
0

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

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

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

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

而且,删除引号

回答

3

转换NOW()一个时间戳你有大约'NOW()'

mysql> SELECT UNIX_TIMESTAMP(NOW()); 
+-----------------------+ 
| UNIX_TIMESTAMP(NOW()) | 
+-----------------------+ 
|   1319288622 | 
+-----------------------+ 

注:如果你需要它,这个函数的反转是FROM_UNIXTIME()把时间戳转换成默认的MySQL DATETIME格式。

正如以下注释中所述,如果您有能力进行更改,建议使用真实的DATETIME类型而不是VARCHAR()来表示此数据。

+2

以完成已经很好的答案:如果您想在不使用任何格式的情况下轻松存储日期,请使用DATETIME/TIME/DATE作为字段类型。如果你不需要这个功能,VARCHAR会更快! – Anonymous

0

一个Linux时间戳可以很容易地存储在一个BIGINT(或一个UNSIGNED INT)中,这会使你想要做的比较类型成为可能。 VARCHAR将做一个词汇而不是数字的比较,而这不是你想要的。使用BIGINT与NOW()UNIX_TIMESTAMP()一起转换应该可以得到你想要的。

使用DATETIME数据类型进行存储甚至更好,并在选择数据时进行转换。将它作为DATETIME存储将来可以证明您的应用程序,如果您迁移到或添加其他Linux平台不适用的平台。那么你只需要修改你的代码,而不是转换你的数据让它继续工作。我现在正在开发一个项目,将日期作为角色数据进行存储,并且尽管您可能遇到的问题比我们少,因为您要存储一段时间邮票,而不是格式化的日期及其伴随的拼写错误。