2015-04-06 83 views
1

我需要每天向所有必須在給定時間範圍內檢查血壓的用戶發送提醒短信。 記錄在我的日程安排表:檢查時間(帶時區)是否在給定時間範圍內

user_id |name |checkup_time |timezone 
1  | user1 | 01:30:00 | PST 
2  | user2 | 03:00:00 | CST 

目前我能得到它的檢查時間是CURRENT_TIME和(當前時間+ 30分鐘)之間的用戶列表。

我用下面的MySQL查詢來實現這一目標:

$checkup_time_min = date('H:i:s'); 
$checkup_time_max = date("H:i:s", strtotime($currTime ."+30 minutes")); 

SELECT ... WHERE checkup_time BETWEEN '".$checkup_time_min."' AND '".$checkup_time_max."' 

不過,我想TIME_ZONE在這種情況下可以考慮。

我真的很感激任何幫助或提示。

在此先感謝

+0

爲什麼不將所有時間都存儲在數據庫中作爲UTC?如果您稍後需要本地時區顯示給用戶,則可以在檢索時間和聯繫信息時進行轉換 – leigero

+1

時區縮寫不足。請閱讀[時區標記wiki](http://stackoverflow.com/tags/timezone/info)。 –

回答

0

感謝您給的指示。我發現CONVERT_TZ是我需要的。

以建議從馬特·約翰遜考慮,我已經改變了在列時區中的數據如下:(從CST到-05:00)

user_id |name |checkup_time |timezone 
1  | user1 | 01:30:00 | -08:00 
2  | user2 | 03:00:00 | -05:00 

和代碼更改爲

$checkup_time_min = date('Y-m-d H:i:s'); 
$checkup_time_max = date("Y-m-d H:i:s", strtotime($currTime ."+30 minutes")); 

SELECT ... WHERE checkup_time BETWEEN CONVERT_TZ ('".$checkup_time_min ."','-05:00',timezone) AND CONVERT_TZ ('".$checkup_time_max ."','-05:00',timezone) 

注意:服務器的時區爲CST,因此轉換完成爲'-05:00'

1

你可能會想在倍UTC存儲在數據庫中,這將使這樣更符合邏輯和易於理解的查詢。當你從數據庫中拉出時間時,你也可以拉動時間軸並在那個時候進行必要的轉換。

正因爲如此,你可以查詢所有值

之間

$checkup_time_min +- (time conversion for given timezone)

$checkup_time_max -+ (time conversion for given timezone)

但你需要運行的每個時區不同的查詢。或者,你可以做一堆if語句來檢查時區,但這並不是很乾淨。

+0

欣賞你的建議。我同意將時間存儲爲UTC會更容易,但它也要求在當前工作流程中進行更改,其中checkup_time需要位於用戶的時區 –

相關問題