这个问题更像是寻找最佳解决方案。我知道如何以我的方式做到这一点。 :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
是的,我需要为所有允许的字符串写这个。有没有更整洁的解决方案?
感谢您的建议! :)
答案 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的数学已知。