Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQLite日期和时间数据类型_C#_Visual Studio 2008_Sqlite_Windows Mobile - Fatal编程技术网

C# 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日格林威治中午以来的天数 公

我正在尝试构建一个漂亮的、小型的数据库,以便在移动应用程序上运行(如果您好奇的话,可以使用WindowsMobile 5)

在中,日期和时间数据类型定义如下:

1.2日期和时间数据类型

SQLite没有为存储日期而预留的存储类 和/或时间。相反,SQLite的内置日期和时间函数 能够将日期和时间存储为文本、实数或整数 价值观:

  • 文本为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年的数据来计算该日期的值。你知道,经过几天的加工,我已经得出结论,我将把日期存储为字符串。我想是你说的,我只是想了想,所以你得到了答案+我也会考虑用这种方式格式化日期。我目前正在接受默认设置,我可以看出这会在哪里造成问题。