SQLite日期和时间数据类型
本文关键字:数据类型 时间 日期 SQLite | 更新日期: 2023-09-27 18:18:25
我正在尝试建立一个漂亮的,小的数据库运行在移动应用程序(Windows mobile 5,如果你好奇)。
在SQLite文档中,日期和时间数据类型定义如下:
1.2日期和时间数据类型
SQLite没有专门的存储类来存储日期和/或时间。相反,SQLite的内置日期和时间函数能够将日期和时间存储为TEXT、REAL或INTEGER价值观:
- 文本为ISO8601字符串("YYYY-MM-DD HH:MM:SS.SSS")。
- REAL为儒略历日数,根据预言,从公元前4714年11月24日格林威治中午算起的天数公历。
- INTEGER作为Unix时间,从UTC时间1970-01-01 00:00:00开始的秒数。
应用程序可以选择在其中任何一个存储日期和时间格式和格式之间自由转换使用内置的日期和时间函数。
因此,保存我的DateTime
值为REAL
(float)或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;
}
有什么帮助吗?
- 如果"可读性"很重要,使用
TEXT
格式。 - 如果节省空间很重要,请使用数字格式之一。
如果你不需要毫秒级的精度,你可以通过只包含你需要的部分来节省TEXT
格式的空间。有3种较短的格式被SQLite日期/时间函数接受:
-
YYYY-MM-DD HH:MM:SS
(19个字符) -
YYYY-MM-DD HH:MM
(16个字符) -
YYYY-MM-DD
(10个字符)
(NEVER use MM/DD/YYYY
;它不被支持,并且不能正确排序。)
我要定义一个基准日期为公元前4714年11月24日吗?(我还没有当然,如果Visual Studio 2008允许我这么做的话。我从来没试过。
You can't: System.DateTime
只支持年份1 ~ 9999。您需要选择一个不同的基准日期,然后执行(dateTime - baseDate).TotalDays + baseDateJD
,其中baseDateJD
是基准日期的儒略历日期。一些合理的选择是:
- 0001-01-01 = jd 1721425.5
- 1970-01-01 = jd 2440587.5
- 2000-01-01 = jd 2451544.5