我正在尝试构建一个漂亮的小型数据库,以便在移动应用程序上运行(Windows Mobile 5,如果您感到好奇的话)。
在SQLite Documentation中,日期和时间数据类型定义如下:
1。2日期和时间数据类型
SQLite没有为存储日期留出的存储类 和/或时间。相反,SQLite的内置日期和时间函数 能够将日期和时间存储为TEXT,REAL或INTEGER 值:
- TEXT as ISO8601字符串(“YYYY-MM-DD HH:MM:SS.SSS”)。
- 真实的朱利安日数,即公元前4714年11月24日格林威治中午以来的天数。根据预示 阳历。
- INTEGER as Unix Time,自1970-01-01 00:00:00 UTC以来的秒数。
应用程序可以选择在任何这些中存储日期和时间 使用内置日期格式和格式之间自由转换 时间函数。
因此,将DateTime
值保存为REAL
(浮点)或INTEGER
的大小相同。
TEXT
格式怎么样?文字YYYY-MM-DD HH:MM:SS.SSS
中有23个字符。 每个字符是8字节吗?如果是这样,那就是巨大浪费空间以文本格式存储(这正是我目前所做的)。
REAL
格式怎么样?我是否定义了公元前4714年11月24日的基准日期? (我甚至不确定 Visual Studio 2008 是否允许我这样做。我从未尝试过。)然后在基准日期和日期之间获得TimeSpan
我想要,提取天数,然后存储?
// 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
的基准日期(请告诉我该怎么做!),然后在基准日期和我之间获得TimeSpan
输入日期,提取秒数,并存储?
// 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 :(得分:2)
TEXT
格式。如果您不需要毫秒精度,则只需包含您需要的部分,即可以TEXT
格式节省空间。 SQLite日期/时间函数接受3种较短格式:
YYYY-MM-DD HH:MM:SS
(19个字符)YYYY-MM-DD HH:MM
(16个字符)YYYY-MM-DD
(10个字符)(从不使用MM/DD/YYYY
;它不受支持,且排名不正确。)
我是否定义基准日期为公元前4714年11月24日? (我不是 确定Visual Studio 2008是否会让我这样做。我从未尝试过。)
您不能:System.DateTime
仅支持1到9999年。您需要选择不同的基准日期,然后执行(dateTime - baseDate).TotalDays + baseDateJD
,其中baseDateJD
是朱利安的日期基准日期。一些合理的选择是: