MySQL时间戳选择日期范围

MySQL时间戳选择日期范围,mysql,timestamp,Mysql,Timestamp,真的不知道从哪里开始。谁能帮我指出正确的方向吗 我在MySQL中有一个时间戳列,我想选择一个日期范围,例如,所有时间戳都在2010年10月 谢谢。从col>=“2010-10-01”和col的表格中选择*通常是: SELECT * FROM table WHERE col >= '2010-10-01' AND col <= '2010-10-31' SELECT * FROM yourtable WHERE yourtimetimefield>='2010-10-0

真的不知道从哪里开始。谁能帮我指出正确的方向吗

我在MySQL中有一个时间戳列,我想选择一个日期范围,例如,所有时间戳都在2010年10月


谢谢。

从col>=“2010-10-01”和col的表格中选择*通常是:

SELECT * FROM table WHERE col >= '2010-10-01' AND col <= '2010-10-31'
SELECT * 
  FROM yourtable
 WHERE yourtimetimefield>='2010-10-01'
   AND yourtimetimefield< '2010-11-01'
选择*
从你的桌子上
其中YourTimeField>='2010-10-01'
和您的时间域<'2010-11-01'
但是,由于您有unix时间戳,因此需要如下内容:

SELECT * 
  FROM yourtable
 WHERE yourtimetimefield>=unix_timestamp('2010-10-01')
   AND yourtimetimefield< unix_timestamp('2010-11-01')
选择*
从你的桌子上
其中YourTimeField>=unix\u时间戳('2010-10-01')
和YourTimeField
一种紧凑、灵活的无小数秒时间戳方法是:

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

如果您使用的是分数秒和MySQL的最新版本,那么最好尽可能使用
=
的方法,避免将函数应用于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');
选择*
从表\u名称
其中时间戳>=UNIX\u时间戳('2010-10-01 00:00:00')
时间戳

将函数应用于时间戳列(例如,FROM_UNIXTIME(timestamp)=…)会使索引更加困难。

此SQL查询将为您提取数据。这很容易,也很快

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

我可以看到人们对这个问题有很多评论。但是我认为,简单地使用
比如
可以更容易地从表中获取数据

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

使用类似于
和post数据通配符搜索。希望这能解决您的问题。

如果您有一个mysql时间戳,比如
2013-09-29 22:27:10
您可以这样做

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

转换到unix,然后使用unix时间函数提取月份,在本例中为9月份。

对不起,我应该提到它是unix时间戳,而不是mysql时间戳(重要的信息要漏掉!!)我看到了这篇文章,我的时间戳很好。我现在面临的问题是,如果使用联接调用它,它总是返回零行。那么,时间戳为
2010-10-31 09:00:00
的记录会发生什么情况呢?我想你知道答案,因为它已经在页面上高于此值6年了
其中col>='2010-10-01'和col<'2010-11-01'
。抱歉,上面没有提到,这是一个unix时间戳,不是mysql时间戳。我看到这篇文章,我的时间戳很好。我现在面临的问题是,如果使用联接调用它,它总是返回零行…我的查询类似于从db.t1中选择*,db.t2,其中t2.t1_id=t1.id,时间戳>='2014-06-21'和时间戳+1,以避免为每次比较转换列。人们会希望这是相当有效的@Jimbo:不,
之间并不是一个很好的选择,因为它在两端都是非包容性的。你必须在“2010-10-01 00:00:00”和“2010-10-31 23:59:59”之间写一些东西才能得到正确的答案,希望不要使用毫秒。此外,9月31日并不存在,因为9月只有30天。如果“30”的意思是,那么它是不正确的,因为9月份的数据将被返回。实际上,MySQL将其解释为10月1日(相当整洁),这在这里是正确的。我不知道你为什么要把它写成9月31日。@WoutervanNifterick不确定这些值到底是怎么回事,但已经修复了。我已经添加了一条关于fsp的评论,因为这是他们之前写的effect@Cez,好的,这样更好,但您需要另一次编辑:)它现在只选择10月1日。但实际上,
之间的
并不适合这样做。如果时间戳中有毫秒,则会错过该月的最后一秒。你必须说:“2010-10-01 23:59:59 999”,并希望MySQL永远不会切换到更高精度的时间戳:)@WoutervanNifterick 6位精度是supported@merlinbeard这实际上对索引非常有效,因为计算值是静态的,可以直接与
yourtimefield
值进行比较。现在,如果您有
WHERE FROM_UNIXTIME(yourtimefield)>=“2010-10-01”
,这将不允许索引,因为需要为每行计算与日期格式进行比较的值。话虽如此。对于大多数用例,我仍然建议使用date、datetime、timestamp字段类型而不是unix时间戳。@MikeBrant:观察正确。此表达式只计算一次,并折叠为常数,仍然可以与
yourtimefield
上的索引匹配。梅林比尔德发表评论后,我立即收到了一些反对票,这表明人们往往在不完全了解自己投票支持什么的情况下投票。嘿,听起来像政治:)@WoutervanNifterick看起来像是你在我的评论后修复了示例代码,所以我的评论不再相关。谢谢你这么做!MikeBrant查看对答案的编辑以查看我的观点:-)@merlinbeard Yes。这些编辑使你的评论毫无意义。我没有看编辑历史。但是看看你什么时候发表评论,什么时候进行编辑,你当时的评论肯定是正确的。
 select * from table WHERE MONTH(FROM_UNIXTIME(UNIX_TIMESTAMP(time)))=9;