C# SQLite日期和时间数据类型
我正在尝试构建一个漂亮的、小型的数据库,以便在移动应用程序上运行(如果您好奇的话,可以使用WindowsMobile 5) 在中,日期和时间数据类型定义如下: 1.2日期和时间数据类型 SQLite没有为存储日期而预留的存储类 和/或时间。相反,SQLite的内置日期和时间函数 能够将日期和时间存储为文本、实数或整数 价值观:C# SQLite日期和时间数据类型,c#,visual-studio-2008,sqlite,windows-mobile,C#,Visual Studio 2008,Sqlite,Windows Mobile,我正在尝试构建一个漂亮的、小型的数据库,以便在移动应用程序上运行(如果您好奇的话,可以使用WindowsMobile 5) 在中,日期和时间数据类型定义如下: 1.2日期和时间数据类型 SQLite没有为存储日期而预留的存储类 和/或时间。相反,SQLite的内置日期和时间函数 能够将日期和时间存储为文本、实数或整数 价值观: 文本为ISO8601字符串(“YYYY-MM-DD HH:MM:SS.SSS”) 真实的朱利安日数字,根据序言,自公元前4714年11月24日格林威治中午以来的天数 公
- 文本为ISO8601字符串(“YYYY-MM-DD HH:MM:SS.SSS”)
- 真实的朱利安日数字,根据序言,自公元前4714年11月24日格林威治中午以来的天数 公历
- 整数表示Unix时间,自1970-01-01 00:00:00 UTC以来的秒数
DateTime
值保存为REAL
(float)或INTEGER
大小相同
文本
格式如何?文本中有23个字符YYYY-MM-DD HH:MM:SS.SSS
是每个字符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;
}
// 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;
}
整数格式如何?我是否可以定义一个基准日期为1970-01-01 00:00:00 UTC
(请告诉我怎么做!),然后获取基准日期和我的输入日期之间的时间跨度,提取秒数并存储
// 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;
}
// 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;
}
有什么帮助吗?有几点我有点困惑。
- 如果“人类可读性”很重要,请使用
文本
格式
- 如果节省空间很重要,请使用其中一种数字格式
如果不需要毫秒精度,可以通过只包含所需的零件来节省文本格式的空间。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日吗。?)我甚至不
当然,如果VisualStudio2008允许我这么做的话。我从未尝试过。)
您不能: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
请不要将日期存储为文本。仅供参考:公元前4714年11月24日的REAL
日期格式抛出了一个ArgumentOutOfRangeException
:“指定的参数超出了有效值的范围。”您需要表示公元前4714年吗?@MitchWheat:另外,如果我存储在UTC时间,用户出于任何原因更改日期,存储的日期时间值糟糕透顶。为美国独立日存储“07/04/1776”是浪费,但要可靠得多——除非我遗漏了什么。我上面引用的SQLite
doc声明他们引用了公元前4714年的数据来计算该日期的值。你知道,经过几天的加工,我已经得出结论,我将把日期存储为字符串。我想是你说的,我只是想了想,所以你得到了答案+我也会考虑用这种方式格式化日期。我目前正在接受默认设置,我可以看出这会在哪里造成问题。