这个问题更像是在寻找最佳解决方案。我知道如何按照自己的方式去做D
我有几个时间间隔作为单词:
- CCD_ 1
- CCD_ 2
- CCD_ 3
this_month
问题是时间作为UNIX时间戳保存在数据库中。
我将举一个例子。假设它是today
。这意味着我需要从今天开始到结束的数据库中选择结果。
这意味着我需要获得当天的第一秒:
mktime(0, 0, 0);
最后一秒:
mktime(23, 59, 59);
然后用这样的东西查询数据库:
WHERE `timestamp` >= first_second OR WHERE `timestamp` <= last_sencond
是的,我需要为所有可能的字符串写这个。有更整洁的解决方案吗?
谢谢你的建议!:(
今天您可以使用:
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())
where date between $start and $stop
使用maketime 根据选项(天、周、月等(定义开始和停止
"整洁的解决方案"是主观的吗?…:-(您的要求似乎与Mysql中已经回答的问题非常相似:选择两个日期之间的所有数据
阅读那里的所有链接
假设您希望记录今天有时间戳:
WHERE date >= UNIX_TIMESTAMP(CURDATE()) AND date <= UNIX_TIMESTAMP(CURDATE()+1)
请注意,第二部分是不必要的,除非你有项目的时间戳在未来。如果需要获取其他日期的值,请相应地计算日期,并使用UNIX_TIMESTAMP()
将其转换为数字时间戳。这将比将数据库中的值转换为date
格式具有更好的性能,因为这将导致无法使用索引。
我建议将DateTime存储为SQL的本地DateTime格式,并根据需要在应用程序中转换为unix时间戳。当然,您可能无法更改模式,但如果可以的话,最好使用RDBMS提供的最原生的数据类型。例如,这允许RDBMS更智能地处理DateTime列上的范围索引。尽管unix时间戳可以在任何使用基于unix Epoch的数学的平台上使用,但从技术上讲,它们仍然是特定于平台的格式。我也不会把DateTime到SQL写成Windows FILETIME,尽管FILETIME到DateTime的数学是已知的。