我有一个表格,其中有一列填充了 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()
但没有任何结果。任何见解表示赞赏。
为了洞察力,请考虑:
SELECT '1970-01-01' + INTERVAL ( 1571152209099 /1000) SECOND
返回:
_dt
--------------------------
2019-10-15 15:10:09.099000
我们认识到1571152209099
来自 JavaScipt的值Date.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] 删除。
我来说两句