2014-08-31 152 views
1

我想将时间戳列表只减少到每天的最后一个时间戳。SQL选择每一天的最后一个时间戳

我可以使用下面的SQL来拉我正在寻找的时间戳,但我也将它们转换为格式化的日期,我不想这样做。

select 
    from_unixtime(intTimeStamp) as day 
from 
    (
     select distinct intTimeStamp from TableA order by intTimeStamp desc 
    ) as t2 
group by 
    date(day) 
order by 
    intTimeStamp desc 

这是输出:

2014-08-29 13:21:01 
2014-08-28 13:21:01 
2014-08-27 13:21:01 
2014-08-26 13:21:01 
2014-08-25 13:21:21 
2014-08-22 10:11:01 
2014-08-21 13:21:01 
2014-08-20 13:21:01 
[remaining omitted] 

这是预期,但我需要在原来的unixtime格式。

但是,简单地删除from_unixtime()函数会产生非常奇怪的行为。它只返回6行,而不是预期的。我注意到,返回的六行中只有一行甚至是当天的最后一个时间戳。它有95%的时间可用时间戳,但我不确定为什么。

select 
    intTimeStamp as day 
from 
    (
     select distinct intTimeStamp from TableA order by intTimeStamp desc 
    ) as t2 
group by 
    date(intTimeStamp) 
order by 
    intTimeStamp desc 

这是输出:

1409343661 
1409170501 
1406060101 
1401221701 
1400271301 
1400012101 

两个explain输出:

1 PRIMARY <derived2> ALL     13338 Using temporary; Using filesort 
2 DERIVED TableA range  PRIMARY 4  10 Using index for group-by; Using temporary; Using filesort 

如何从每天只检索最后的时间戳,作为第一个查询,但不必将它们从一个unix时间戳(或至少让它们输出为一个)?

谢谢。

+0

的问题两个查询看起来与我。 – 2014-08-31 21:23:52

+0

我的歉意 - 我已经更新了第二个查询。 – David 2014-08-31 21:26:02

+0

。 。将整数转换为日期时,MySQL会做很奇怪的事情。你需要'from_UnixTime()'。 – 2014-09-01 01:33:49

回答

1

你可以用一个简单的group by做到这一点:

select max(intTimeStamp) as lasttimestamp 
from TableA 
group by date(from_unixtime(intTimeStamp)) 
order by lasttimestamp desc; 
+0

这是完美的,更简单。 鉴于我提供的信息,有什么突出给你,会导致我在第二个查询中描述的奇怪行为? – David 2014-08-31 21:20:27

相关问题