SQLite日期和时间数据类型

时间:2011-12-20 01:50:30

标签: c# visual-studio-2008 sqlite windows-mobile

我正在尝试构建一个漂亮的小型数据库,以便在移动应用程序上运行(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;
}

对此有何帮助?我有点困惑几点。

1 个答案:

答案 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是朱利安的日期基准日期。一些合理的选择是:

  • 0001-01-01 = JD 1721425.5
  • 1970-01-01 = JD 2440587.5
  • 2000-01-01 = JD 2451544.5