如何从按时间戳过滤的数据库中选择结果?

时间:2011-10-26 14:08:38

标签: php mysql date timestamp compare

这个问题更像是寻找最佳解决方案。我知道如何以我的方式做到这一点。 :d

我的时间间隔很少:

  • today
  • tomorrow
  • this_week
  • this_month;

问题是时间以UNIX时间戳保存在数据库中。

我将尝试展示一个例子。让我们说它是today。这意味着我需要从今天开始到结束时从数据库中选择结果。

这意味着我需要获得当天的第一秒:

mktime(0, 0, 0);

......最后一秒:

mktime(23, 59, 59);

用这样的东西查询数据库:

WHERE `timestamp` >= first_second OR WHERE `timestamp` <= last_sencond

是的,我需要为所有允许的字符串写这个。有没有更整洁的解决方案?

感谢您的建议! :)

5 个答案:

答案 0 :(得分:2)

今天你可以使用:

WHERE CAST(FROM_UNIXTIME(timestamp) AS DATE) = CURDATE()

明天:

WHERE CAST(FROM_UNIXTIME(timestamp) AS DATE) = DATE_ADD(CURDATE(), INTERVAL 1 DAY)

这个月:

WHERE MONTH(CAST(FROM_UNIXTIME(timestamp) AS DATE)) = MONTH(CURDATE())

答案 1 :(得分:1)

where date between $start and $stop

使用maketime

定义开始和停止,具体取决于选项(日,周,月......等)

答案 2 :(得分:1)

“整洁的解决方案”是主观的吗? ...... :-)您的要求似乎与Mysql: Select all data between two dates

中已经回答的问题非常相似

阅读那里的所有链接

答案 3 :(得分:1)

假设您希望今天记录时间戳:

WHERE date >= UNIX_TIMESTAMP(CURDATE()) AND date <= UNIX_TIMESTAMP(CURDATE()+1)

请注意,除非您将来有时间戳的项目,否则不需要第二部分。如果您需要获取其他日期的值,请相应地计算日期并将其转换为UNIX_TIMESTAMP()的数字时间戳。这比将数据库中的值转换为date格式具有更好的性能,因为这将使索引无法使用。

答案 4 :(得分:0)

我建议将DateTime以SQL本机DateTime格式存储,并根据需要在应用程序中转换为unix时间戳。当然,您可能无法更改架构,但如果可以,最好使用RDBMS提供的最本机数据类型。例如,这允许RDBMS更智能地处理DateTime列上的范围索引。虽然unix时间戳可以在任何使用基于Unix Epoch的数学平台上使用,但它们在技术上仍然是特定于平台的格式。我不会将DateTime写入SQL作为Windows FILETIME,尽管事实上FILETIME到DateTime的数学已知。