2011-12-20 136 views
3

我正在嘗試構建一個漂亮的小型數據庫以在移動應用程序上運行(Windows Mobile 5,如果您好奇)。SQLite日期和時間數據類型

SQLite Documentation,日期和時間數據類型定義如下:

1.2日期和時間數據類型

SQLite沒有存儲類,用於存儲日期 擱置和/或次數。取而代之的是,內置的SQLite 的日期和時間函數能夠存儲日期和時間爲TEXT,REAL或INTEGER 值:

  • TEXT爲ISO8601字符串(「YYYY-MM-DD HH:MM :SS.SSS「)。
  • 真實的Julian日數,自中午4714年11月24日格林威治中午以來的天數。根據公曆 公曆。
  • INTEGER as Unix Time,自1970-01-01 00:00:00 UTC以來的秒數。

應用程序可以選擇存儲日期和時間在任何這些 格式和自由使用內置的日期和時間 功能格式之間轉換。

所以,救了我的DateTime值無論是作爲REAL(浮動)或INTEGER是相同的尺寸。

TEXT格式?那怎麼寫?文字上面有23個字符YYYY-MM-DD HH:MM:SS.SSS每個字符是8字節嗎?如果是這樣,那是一個巨大浪費空間以文本格式存儲(這正是我目前正在做的)。

REAL格式?那怎麼辦?我是否會定義公元前4714年11月24日的基準日期? (我甚至不知道如果Visual Studio 2008會讓我這樣做,我從來沒有嘗試過。)然後得到 基準日期和我想要的日期,提取天數,並存儲?

// is this how to declare this date? 
private static readonly DateTime nov24_4714bc = new DateTime(-4714, 11, 24); 

public static double GetRealDate(DateTime dateTime) { 
    // FYI: subtracting dates in .NET returns a time span object 
    return (dateTime - nov24_4714bc).TotalDays; 
} 

INTEGER格式?那怎麼寫?我會定義一個的基準日期1970-01-01 00:00:00 UTC(請告訴我該怎麼做!),然後得到 基準日期和我的輸入日期,提取秒數,並存儲?

// is this a UTC date? 
private static readonly DateTime utc1970_01_01 = new DateTime(1970, 1, 1); 

public static double GetIntDate(DateTime dateTime) { 
    // FYI: subtracting dates in .NET returns a time span object 
    return (dateTime - nov24_4714bc).TotalSeconds; 
} 

對此有何幫助?我有幾點困惑。

+0

請不要以文本形式存儲日期。 – 2011-12-20 01:53:20

+0

僅供參考:公元前4714年11月24日的'REAL'日期格式引發'ArgumentOutOfRangeException':*「指定的參數超出了有效值的範圍。」* – jp2code 2011-12-20 03:17:30

+0

並且您是否需要表示4714 BC? – 2011-12-20 03:18:19

回答

2
  • 如果「人類可讀性」很重要,則使用TEXT格式。
  • 如果節省空間很重要,請使用其中一種數字格式。

如果您不需要幾毫秒的精度,您可以通過只包含您需要的零件來節省TEXT格式的空間。有3種由SQLite的日期/時間函數接受短格式:

  • YYYY-MM-DD HH:MM:SS(19個字符)
  • YYYY-MM-DD HH:MM(16個字符)
  • YYYY-MM-DD(10個字符)

NEVER使用MM/DD/YYYY;不支持,並且不能正確排序。)

我會定義一個基準日期,即公元前4714年11月24日? (我也不 知道的Visual Studio 2008將讓我做,我從來沒有嘗試過。)

您不能:System.DateTime只支持年1〜9999,您需要選擇一個不同的基準日期,然後執行(dateTime - baseDate).TotalDays + baseDateJD,其中baseDateJD是基準日期的Julian日期。一些合理的選擇是:

  • 0001-01-01 = JD 1721425.5
  • 1970-01-01 = JD 2440587.5
  • 2000-01-01 = JD 2451544.5
+0

你知道,經過幾天的磨練之後,我已經得出結論,我將把日期存儲爲一個字符串。我想你說過了,我只是想到了,所以你得到了答案。 +1,以考慮格式化日期。我目前正在接受默認設置,我可以看到會導致問題的位置。 – jp2code 2011-12-23 01:04:17