Mysql 按日期选择似乎不起作用
由于我不是世界上最伟大的SQLer,我正在一步一步地朝着某个大目标努力 我有一张桌子:Mysql 按日期选择似乎不起作用,mysql,Mysql,由于我不是世界上最伟大的SQLer,我正在一步一步地朝着某个大目标努力 我有一张桌子: mysql> describe taps; +---------------+-----------+------+-----+-------------------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+-----------+------+---
mysql> describe taps;
+---------------+-----------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-----------+------+-----+-------------------+-------+
| tag_id | int(11) | YES | | NULL | |
| time_stamp | timestamp | NO | | CURRENT_TIMESTAMP | |
| event_id | int(11) | YES | | NULL | |
| event_station | int(11) | YES | | NULL | |
| device_id | text | YES | | NULL | |
| device_type | text | YES | | NULL | |
+---------------+-----------+------+-----+-------------------+-------+
6 rows in set (0.00 sec)
并希望在今天,即2017年2月12日,选择给定日期的所有条目
我正在努力
mysql> select * from taps WHERE (event_id=4)
AND ((time_stamp >= 1486857600000) AND (time_stamp <= 1486944000000));
所以,我试着选角
select * from taps WHERE (event_id=4)
AND ((time_stamp >= CAST(1486857600000 AS DATETIME))
AND (time_stamp <= CAST(1486944000000 AS DATETIME)));
Empty set (0.00 sec)
我做错了什么?我的查询应该是什么?MySQL对于日期/时间的术语非常混乱,请参见。时间戳本质上是带有时区的日期时间,因为该值存储为UTC,但在本地时区中报告 不要将此时间戳与Unix时间戳混淆,Unix时间戳只是自1970-01-01以来的秒数,在某些情况下是毫秒数 在您的情况下,请尝试以下方法:
select t.*
from taps t
where event_id = 4 and
time_stamp >= '2017-02-11 07:00:00' and
time_stamp < '2017-02-12 07:00:00';
您可以使用from_unixtimestap。然而,人们普遍认为日期格式更容易阅读
注意:我将最后一个条件改为严格不等式。这将为您提供24小时无时间重复的服务,以防恰好在2017-02-12 07:00:00发生某些事情。MySQL的日期/时间术语非常混乱,请参见。时间戳本质上是带有时区的日期时间,因为该值存储为UTC,但在本地时区中报告 不要将此时间戳与Unix时间戳混淆,Unix时间戳只是自1970-01-01以来的秒数,在某些情况下是毫秒数 在您的情况下,请尝试以下方法:
select t.*
from taps t
where event_id = 4 and
time_stamp >= '2017-02-11 07:00:00' and
time_stamp < '2017-02-12 07:00:00';
您可以使用from_unixtimestap。然而,人们普遍认为日期格式更容易阅读
注意:我将最后一个条件改为严格不等式。如果恰好在2017-02-12 07:00:00发生了什么事情,这将为您提供24小时不重复的时间。在SQL中,文字时间戳值通常以字符串形式提供,格式为“YYYY-MM-DD HH:MM:SS”。MySQL确实允许在实际格式中使用一些纬度。较新版本的MySQL允许分数秒。有关更完整的说明,请参阅MySQL参考手册 例如,MySQL可以识别以下任何一种:
'2017-02-12 09:30:45'
'17-02-12 09:30:45'
170212093045
如果我们需要提供/指定表示自“1970-01-01 00:00:00”以来整数毫秒的文字值,我们可以使用SQL表达式将这些值转换为可与时间戳进行比较的值。作为示范:
SELECT '1970-01-01' + INTERVAL 1486857600000 / 1000 SECOND AS ts
如果我们需要在WHERE子句中的条件中提供整数毫秒值作为文本,那么我们可以使用上面的表达式
问题中的查询可以执行类似的操作来比较时间戳列中的值
AND time_stamp >= '1970-01-01' + INTERVAL 1486857600000 / 1000 SECOND
AND time_stamp < '1970-01-01' + INTERVAL 1486944000000 / 1000 SECOND
在SQL中,文字时间戳值通常作为字符串提供,格式为“YYYY-MM-DD HH:MM:SS”。MySQL确实允许在实际格式中使用一些纬度。较新版本的MySQL允许分数秒。有关更完整的说明,请参阅MySQL参考手册 例如,MySQL可以识别以下任何一种:
'2017-02-12 09:30:45'
'17-02-12 09:30:45'
170212093045
如果我们需要提供/指定表示自“1970-01-01 00:00:00”以来整数毫秒的文字值,我们可以使用SQL表达式将这些值转换为可与时间戳进行比较的值。作为示范:
SELECT '1970-01-01' + INTERVAL 1486857600000 / 1000 SECOND AS ts
如果我们需要在WHERE子句中的条件中提供整数毫秒值作为文本,那么我们可以使用上面的表达式
问题中的查询可以执行类似的操作来比较时间戳列中的值
AND time_stamp >= '1970-01-01' + INTERVAL 1486857600000 / 1000 SECOND
AND time_stamp < '1970-01-01' + INTERVAL 1486944000000 / 1000 SECOND
您不能使用time_stamp>cast'2017-02-12'作为日期时间吗?这些值是可变的,取自另一个表。这些硬编码的值只是一个例子。你不能使用time_stamp>cast'2017-02-12'作为日期时间吗?这些值是可变的,取自另一个表。那些硬编码的值只是一个例子。我简化了一些东西,因为我想与变量进行比较,变量的值是我从另一个表中获得的,也是时间戳类型的。我简化了一些东西,因为我想与变量进行比较,变量的值是我从另一个表中获得的,也属于时间戳类型