2013-01-17 41 views
1

我有一個表,其中每行都有一個時間戳。時間戳是一個unix時間戳。我想使用這些數據做一些報告,這需要我將這些數據分組一段時間(現在,讓我們只說一天:如此86400秒)。這可以通過地板時間戳來實現,即:帶時區支持的地板unix時間戳

mysql> set time_zone='+00:00'; 
Query OK, 0 rows affected (0.00 sec) 

mysql> select NOW(), FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP()/86400)*86400); 
+---------------------+----------------------------------------------------+ 
| NOW()    | FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP()/86400)*86400) | 
+---------------------+----------------------------------------------------+ 
| 2013-01-17 06:06:37 | 2013-01-17 00:00:00        | 
+---------------------+----------------------------------------------------+ 
1 row in set (0.01 sec) 

這讓我做下面的數據彙總:

select FROM_UNIXTIME(FLOOR(timestamp/86400)*86400) groupts, count(some_id) from table group by groupts order by groupts; 

所有這一切都完美的作品,現在我想比較數據還有其他一些報告,我只在特定時區有數據,我們說它的EST。

不幸的是(顯然),地板不工作了:

mysql> set time_zone='-05:00'; 
Query OK, 0 rows affected (0.00 sec) 

mysql> select NOW(), FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP()/86400)*86400); 
+---------------------+----------------------------------------------------+ 
| NOW()    | FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP()/86400)*86400) | 
+---------------------+----------------------------------------------------+ 
| 2013-01-17 01:10:38 | 2013-01-16 19:00:00        | 
+---------------------+----------------------------------------------------+ 
1 row in set (0.00 sec) 

並最終引出了我的問題: 有什麼辦法地板基於特定時區的時間戳?即地板將確保該時區中從00:00-23:59的所有值都以特定組爲單位?

謝謝!

回答

0

您需要將時區偏移量從UTC轉換爲秒;那麼在分割和相乘之前,您需要從Unix時間戳中添加或減去該偏移量,然後再次將其添加回來。

例如:

我們可以在時區建立UTC值的範圍爲日期2012-01-17 UTC-05:00(US /東方,或美國/紐約):

$ timestamp -Z -z -05:00 1358398800 1358485200 
1358398800 = Thu Jan 17 00:00:00 2013 -05:00 
1358485200 = Fri Jan 18 00:00:00 2013 -05:00 
$ timestamp -Z -z 00:00 1358398800 1358485200 
1358398800 = Thu Jan 17 05:00:00 2013 +00:00 
1358485200 = Fri Jan 18 05:00:00 2013 +00:00 
$ 

時區偏移距UTC(5 * 3,600)約18,000秒,當然每天有86,400秒。

然後,我們可以用bc表明,計算應該是:

  • ((UTC_TIME + TZ_OFFSET)/ secs_per_day)* secs_per_day - TZ_OFFSET

例如,我們可以使用bc做計算:

$ bc 
scale=0 
a=1358398800 
b=a+86400 
c=-18000 
d=86400 
((a+c)/d)*d-c 
1358398800 
((b-1+c)/d)*d-c 
1358398800 
((b+c)/d)*d-c 
1358485200 
b 
1358485200 
quit 
$ 

正如您所見,2012-01-17在美國/復活節期間n時區全部分組到同一組(使用極端時間值進行演示)。

因此,只要您可以計算出UTC的時區偏移(以秒爲單位),格林威治經時西部的時區爲負值,東部時區爲正值,則可以使用計算所示。

SELECT NOW(), FROM_UNIXTIME(FLOOR((UNIX_TIMESTAMP() + (-18000))/86400)*86400 - (-18000)); 

要概括:

FLOOR((timestamp + (offset_in_seconds))/86400)*86400 - (offset_in_seconds) 

哪裏offset_in_seconds可正可負。

+0

我編輯了你的答案並修復了查詢。實際查詢應該是:FLOOR(((timestamp +(offset_in_seconds))/ 86400)* 86400 - (offset_in_seconds)。謝謝你的回答! –

+0

感謝您的修正! –