根据时间戳选择记录

威克尼

我有一个表格,其中有一列填充了 Javascript 的Date.now()函数。列名是update_time,其样本值为1571152209099

如何为所有具有今天日期的行(仅考虑年、月和日)进行选择?

我试过这样的事情,但它让我无处可去。

Select *
from program_end
where workout_rate between 0 and 1
  AND FROM_UNIXTIME(update_time, '%YYYY-%MM-%DD') = CURDATE()

我还尝试更改时间格式:

Select *
from program_end
where FROM_UNIXTIME(update_time, '%Y-%m-%d') = CURDATE()

但没有任何结果。任何见解表示赞赏。

斯宾塞7593

为了洞察力,请考虑:

 SELECT '1970-01-01' + INTERVAL ( 1571152209099 /1000) SECOND

返回:

_dt                         
--------------------------
2019-10-15 15:10:09.099000

我们认识到1571152209099来自 JavaSciptDate.now()是从时代开始(UTC 1970 年 1 月 1 日午夜)算起的整数毫秒。

还要考虑:

SELECT TIMESTAMPDIFF(SECOND,'1970-01-01 00:00','2019-10-15 00:00')*1000 AS _dt_1
     , TIMESTAMPDIFF(SECOND,'1970-01-01 00:00','2019-10-16 00:00')*1000 AS _dt_2 

返回:

        _dt_1           _dt_2
-------------  --------------
1571097600000   1571184000000

TIMESTAMPDIFF 函数以秒为单位返回差值;我们乘以 1000 得到毫秒。

我们认识到任何Date.now()大于或等于或_dt_1小于的JavaScript毫秒值都_dt_2发生在日期的某个时间'2109-10-15'


所以,给定的update_time是自时代开始以来的毫秒数......

在查询中,我会将裸update_time列与两个文字值进行比较

WHERE update_time >= 1571097600000 
  AND update_time <  1571184000000

引用裸列的优点是 MySQL 可以利用有效的范围扫描操作,并提供合适的索引。

要从给定的日期值导出这些毫秒值,我们可以在表达式中进行计算,如下所示:

WHERE update_time >= TIMESTAMPDIFF(SECOND,'1970-01-01', '2019-10-15' )*1000 
  AND update_time <  TIMESTAMPDIFF(SECOND,'1970-01-01', '2019-10-15' + INTERVAL 1 DAY)*1000
                                                         ^^^^^^^^^^

右侧的那些表达式只在语句执行开始时计算一次。

请注意,如果我们包装update_time在一个函数中,那么必须为 , 的每个值对update_time表中的每一行(未被其他谓词过滤掉)进行评估

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章