2015-09-21 41 views
3

看來django或sqlite數據庫正在以微秒精度存儲datetimes。然而passing a time to javascriptDate對象時僅支持毫秒:在django和javascript之間傳遞datetime時保持微秒精度

var stringFromDjango = "2015-08-01 01:24:58.520124+10:00"; 
var time = new Date(stringFromDjango); 
$('#time_field').val(time.toISOString()); //"2015-07-31T15:24:58.520Z" 

注意58.520124現在58.520

例如,當我想爲日期時間小於或等於現有對象時間的所有對象(即MyModel.objects.filter(time__lte=javascript_datetime))創建查詢集時,這就成爲一個問題。通過截短微秒,對象不再出現在列表中,因爲時間不相等。

我該如何解決這個問題?有沒有支持微秒準確度的日期時間JavaScript對象?我可以截斷數據庫中的時間爲幾毫秒(我幾乎全是在使用auto_now_add)或要求以降低的準確度執行查詢?

回答

1

我該如何解決這個問題?

TL; DR:存儲精度要求不高,無論是由:

  • 哄騙你的數據庫平臺,只存儲毫秒,並丟棄任何額外的精度(很難在SQLite的,我認爲)
  • 永遠只能插入你想要的精確值(很難保證你所投保的所有情況下)

是否有JavaScript對象,支持MIC日期時間精確到秒?

如果您將日期編碼爲字符串或數字,您可以添加儘可能多的準確性。還有其他選項(一些討論in this thread)。除非你真的想要這個準確性,但它可能不是最好的方法。

我可以截斷數據庫次毫秒..

是的,但因爲你在SQLite的這是一個有點怪異。 SQLite並沒有真正的日期;您實際上將值存儲在text,realinteger字段中。這些底層存儲類別決定了您可以存儲的值的精度和範圍。有一個體面的write up of the differences here

例如,您可以將您的基礎存儲類更改爲integer。這將截斷存儲在該字段中的日期,精度爲1秒。從JS執行查詢時,可以使用Date.prototype.setMilliseconds() function同樣截斷日期。例如..

MyModel.objects.filter(time__lte = javascript_datetime.setMilliseconds(0)) 

一個功能更完備的數據庫平臺可以更好地處理它。例如在PostgreSQL中,您可以specify the precision stored more exactly。這將添加一個時間戳列,其精度可以達到毫秒(與Javascript匹配)。

alter table "my_table" add "my_timestamp" timestamp (3) with time zone 

MySQL將let you do the same thing

..或要求以降低的準確性執行查詢?

是的,但這通常是錯誤的方法。

如果您正在篩選的標準確切無誤,那麼您確定;您可以截斷該值然後進行過濾(如上面的..setMilliseconds()示例中所示)。但是,如果您在檢查的數據庫中的值太精確,您將會遇到「不良時間」。

可以編寫一個查詢,使得存儲的值被格式化或截斷進行比較,以你的標準之前,以減少他們的精度,但該操作將需要進行存儲每個值。這可能是數百萬的價值。更重要的是,由於您是動態生成值,因此您只是規避了針對存儲值創建的所有索引。