2010-10-20 201 views
28

不确定该从哪里开始。任何人都可以帮助/指向正确的方向。MySQL时间戳选择日期范围

我在MySQL时间戳列,我想选择例如日期范围,这是在2010年十月

感谢所有时间戳。

+1

对不起,上面没有提到,它是一个unix时间戳,不是mysql时间戳。 – DRKM 2010-10-20 10:31:15

+0

我看到这篇文章,我的时间戳工作正常,我现在面临的问题,如果调用它与一个连接它总是带回零行返回...我的查询是这样的SELECT * FROM db.t1,db.t2 WHERE t2 .t1_id = t1.id AND timestamp> ='2014-06-21'AND timestamp <='2014-07-20'; – 2014-10-10 08:00:46

回答

35

通常它会是这样:

SELECT * 
    FROM yourtable 
WHERE yourtimetimefield>='2010-10-01' 
    AND yourtimetimefield< '2010-11-01' 

但是因为你有一个UNIX时间戳,你需要这样的事:

SELECT * 
    FROM yourtable 
WHERE yourtimetimefield>=unix_timestamp('2010-10-01') 
    AND yourtimetimefield< unix_timestamp('2010-11-01') 
+0

谢谢! (另外5个字符) – DRKM 2010-10-20 10:47:54

+1

@merlinbeard这对于索引来说实际上是完全正常的,计算值是静态的,可以直接与'yourtimefield'值进行比较。现在,如果您有'WHERE FROM_UNIXTIME(yourtimefield)> ='2010-10-01''这将不允许建立索引,因为需要为每一行计算与日期格式比较的值。话虽如此。对于大多数使用情况,我仍然会建议使用日期,日期时间,时间戳记字段类型而不是unix时间戳记。 – 2016-01-07 19:08:20

+0

@MikeBrant:正确的观察。这个表达式被计算一次并被折叠成一个常量,并且仍然可以与'yourtimefield'上的索引匹配。 merlinbeard的评论之后,我立即收到了一些预言,表明人们经常在没有完全理解他们投票的情况下投票。嘿,听起来像政治:) – 2016-01-08 16:05:54

5
SELECT * FROM table WHERE col >= '2010-10-01' AND col <= '2010-10-31' 
+0

对不起,我应该提到它是一个unix时间戳,而不是一个mysql时间戳(重要的信息位错过!) – DRKM 2010-10-20 10:30:53

+0

我看到这篇文章,我的时间戳工作正常,我现在面临的问题,如果调用它与一个连接它总是带回返回零行 – 2014-10-06 09:13:03

+0

那么会发生什么记录,具有时间戳2010-10-31 09: 00:00'? – 2016-01-11 01:33:40

34

紧凑,灵活的方法对时间戳没有小数秒将是:

SELECT * FROM table_name 
WHERE field_name 
BETWEEN UNIX_TIMESTAMP('2010-10-01') AND UNIX_TIMESTAMP('2010-10-31 23:59:59') 

如果您使用的是小数秒和最新版本的MySQL,那么您最好采用按照Wouter's answer使用>=<运营商的方法。

这里是具有分数第二精度(最大精度在使用中)定义的时间的字段的一个示例:

mysql> create table time_info (t_time time(6), t_datetime datetime(6), t_timestamp timestamp(6), t_short timestamp null); 
Query OK, 0 rows affected (0.02 sec) 

mysql> insert into time_info set t_time = curtime(6), t_datetime = now(6), t_short = t_datetime; 
Query OK, 1 row affected (0.01 sec) 

mysql> select * from time_info; 
+-----------------+----------------------------+----------------------------+---------------------+ 
| 22:05:34.378453 | 2016-01-11 22:05:34.378453 | 2016-01-11 22:05:34.378453 | 2016-01-11 22:05:34 | 
+-----------------+----------------------------+----------------------------+---------------------+ 
1 row in set (0.00 sec) 
+0

+1,用于避免为每次比较转换列。人们会希望这非常有效! – 2010-10-20 10:45:48

+0

@Jimbo:不,“BETWEEN”在这里并不是一个好的选择,因为它在两端都是非包含的。 你必须写'2010-10-01 00:00:00'和'2010-10-31 23:59:59'之间的东西才能得到正确的答案,并且希望不要使用毫秒。 此外,9月31日不存在,因为9月只有30天。如果意思是“30”,那么它是不正确的,因为来自九月的数据将被返回。实际上,MySQL将这个解释为十月一日(非常整洁),这在这里是正确的。我不确定为什么你会在9月31日写它。 – 2016-01-08 16:01:47

+0

@WoutervanNifterick不确定到底发生了什么,但已修复。我已经添加了一个关于fsp的评论,因为这是在他们有效之前写的 – Cez 2016-01-08 19:35:02

3

只要有可能,应避免在where子句中施加功能柱:

SELECT * 
    FROM table_name 
WHERE timestamp >= UNIX_TIMESTAMP('2010-10-01 00:00:00') 
    AND timestamp < UNIX_TIMESTAMP('2010-11-01 00:00:00'); 

在timestamp列中应用函数(例如,FROM_UNIXTIME(timestamp)= ...)会使索引变得更加困难。

3

此SQL查询将为您提取数据。它很容易和快速。

SELECT * 
    FROM table_name 
    WHERE extract(YEAR_MONTH from timestamp)="201010"; 
3

我可以看到有人对这个问题给出了很多评论。但我认为,简单使用LIKE可能更容易从表中获取数据。

SELECT * FROM table WHERE COLUMN LIKE '2013-05-11%' 

使用LIKE和发布数据通配符搜索。希望这会解决你的问题。

+0

编辑内容? – abhijitcaps 2016-12-07 02:14:02

0

如果你有一个MySQL时间戳,像2013-09-29 22:27:10你可以做到这一点

select * from table WHERE MONTH(FROM_UNIXTIME(UNIX_TIMESTAMP(time)))=9; 

转换为UNIX,然后使用UNIX时间函数来提取月份,在这种情况下,9九月份。