2013-03-28 26 views
0

我有一個城市的普通運輸規格數據的數據庫,定義在午夜後的運輸服務小時> 24.因此,在stop_times表中,我們有很多次,例如定義爲25:00:00和26:00:00等。因爲我需要對這個數據庫的一部分執行時間減法,所以我想寫一個用戶定義的python腳本來處理這個腳本,並使用python create_function sqlite命令將其與我的數據庫相關聯。Python腳本的Sqlite時間減法午夜後

出於某種原因,當我運行查詢我在心中對這個數據集,我得到

sqlite3.OperationalError: user-defined function raised exception 

這裏是時間的減法運算的功能,我寫在午夜後處理時間。我相信這是一團糟。如果您有關於如何更有效地處理此問題的任何提示,我很樂意聽到這些。提前致謝。

def time_delta(t1, t2): 
old_arrival = t1.encode('utf-8').split(':') 
old_departure = t2.encode('utf-8').split(':') 

new_arrival_string = "2013-03-16 %s:%s:%s" % (int(old_arrival[0])-12, old_arrival[1], old_arrival[2]) 
new_arrival_format = "%Y-%m-%d %H:%M:%S" 
arr = datetime.datetime.strptime(new_arrival_string, new_arrival_format) 

new_departure_string = "2013-03-16 %s:%s:%s" % (int(old_departure[0])-12, old_departure[1], old_departure[2]) 
new_departure_format = "%Y-%m-%d %H:%M:%S" 
dep = datetime.datetime.strptime(new_departure_string, new_departure_format) 

difference = arr-dep 
seconds = difference.seconds 

if difference.days < 0: 
    difference = dep-arr 
    seconds = (-1) * difference.seconds 

return seconds 
+0

在您的函數中記錄異常。 – 2013-03-28 08:19:16

+0

在該函數中使用[try/except](http://docs.python.org/tutorial/errors.html)。 – 2013-03-28 14:25:11

+0

sqlite運行這個函數時如何做到這一點?當我遍歷從SQL出來的未提取結果並自己調用函數時,沒有未捕獲的異常通過sys.excepthook記錄。 SQL如何運行語句時如何記錄它們? – 2013-03-28 14:25:41

回答

0

你能改變數據庫模式嗎?如果是這樣,避開這個問題的一種方法可能是將到達和離開時間存儲爲不是字符串,而是存儲自午夜以來的整數秒(呃,正如規範所定義的「中午減12小時」),並且改變你所使用的任何工具用於加載數據庫以便在stop_times.txt中使用的「HH:MM:SS」格式進行轉換。

這不僅爲您提供了一個不受任何24小時限制約束的停止時間的良好規範表示形式,還可以簡化計算時間間隔並在特定時間段內爲停止時間構建數據庫查詢。