2017-02-12 18 views
0

因为我不是世界上最伟大的SQLer,所以我正在一步一步地努力工作。按日期选择似乎不起作用

我有一个表:

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) 

,并想选择一个给定的日期(今天,2月12日,'17)的所有条目。

我想

mysql> select * from taps WHERE (event_id=4) 
      AND ((time_stamp >= 1486857600000) AND (time_stamp <= 1486944000000)); 

空集,2个警告(0.00秒)

重要:我简单的事情,因为我想用变量,有我从获得的值进行比较另一个表格,其类型也是timestamp

嗯,警告....

mysql> SHOW WARNINGS; 
+---------+------+----------------------------------------------------------------------------+ 
| Level | Code | Message                 | 
+---------+------+----------------------------------------------------------------------------+ 
| Warning | 1292 | Incorrect datetime value: '1486857600000' for column 'time_stamp' at row 1 | 
| Warning | 1292 | Incorrect datetime value: '1486944000000' for column 'time_stamp' at row 1 | 
+---------+------+----------------------------------------------------------------------------+ 
2 rows in set (0.00 sec) 

所以,我试图铸造

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> select * from taps order by time_stamp limit 3; 
+--------+---------------------+----------+---------------+-----------+-------------+ 
| tag_id | time_stamp   | event_id | event_station | device_id | device_type | 
+--------+---------------------+----------+---------------+-----------+-------------+ 
|  44 | 2017-02-12 15:10:25 |  NULL |   16 | NULL  | NULL  | 
|  37 | 2017-02-12 15:10:27 |  NULL |   14 | NULL  | NULL  | 
|  50 | 2017-02-12 15:10:28 |  NULL |   15 | NULL  | NULL  | 
+--------+---------------------+----------+---------------+-----------+-------------+ 
3 rows in set (0.00 sec) 

我在做什么错了?我的查询应该是什么?

+1

不能使用比较'TIME_STAMP> CAST(“2017年2月12日”的日期时间)'查询? – McNets

+0

这些值是可变的,取自另一个表。那些硬编码值就是例子。 – Mawg

回答

3

MySQL对于日期/时间的东西有非常混淆的术语(参见here)。 A timestamp本质上是一个带时区的日期时间,因为该值存储为UTC,但在本地时区中报告。

此时间戳不被使用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_unixtimestamp()。但是,人们通常会发现日期格式更容易阅读。

注:我改变了最后一个条件严格的不平等。这给你24小时不重复的时间,以防发生在2017-02-12 07:00:00。

+0

我简化了一些事情,因为我想和变量相比较,变量有我从另一个表中获得的值,这些值也是类型的时间戳 – Mawg

1

在SQL中,文本TIMESTAMP值通常以字符串形式提供,格式为'YYYY-MM-DD HH:MM:SS'。 MySQL确实允许一些实际格式的纬度。更新版本的MySQL允许小数秒。有关更完整的描述,请参阅MySQL参考手册。

https://dev.mysql.com/doc/refman/5.6/en/datetime.html

作为一个例子中,MySQL将认识到任何这些:

'2017-02-12 09:30:45' 
'17-02-12 09:30:45' 
170212093045 

如果我们需要提供一个要求/指定因为“1970年至1901年,代表整数毫秒文字值-01 00:00:00',我们可以使用SQL表达式将它们转换为可以与TIMESTAMP进行比较的值。作为示范:

SELECT '1970-01-01' + INTERVAL 1486857600000/1000 SECOND AS ts 

如果我们需要为文字在WHERE子句中提供整数毫秒值的条件,那么我们就可以使用表达式像上面的。

的问题可以做这样的事情的价值TIMESTAMP列

AND time_stamp >= '1970-01-01' + INTERVAL 1486857600000/1000 SECOND 
AND time_stamp < '1970-01-01' + INTERVAL 1486944000000/1000 SECOND