2011-12-20 230 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

相关问题