【问题标题】:Excel/SQLite date serial numbersExcel/SQLite 日期序列号
【发布时间】:2011-02-15 17:51:05
【问题描述】:

如何让 SQLite 将 excel 类型的序列号转换为日期,例如我希望表格中的整数 40074 以某种方式获得 2009 年 9 月 18 日的日期?

日期已经在 SQLite 中了。

【问题讨论】:

    标签: excel datetime date sqlite


    【解决方案1】:
    sqlite> SELECT DATE('1899-12-30', '+40074 days');
    2009-09-18
    

    【讨论】:

      【解决方案2】:

      这似乎有效:

      sqlite> SELECT DATETIME((49400 * 3600 * 24) - 3014928000, 'unixepoch');
      2009-09-18 00:00:00
      

      老实说,我只是猜测并检查了那里的常数,但我确信有简单的数学可以支持它。

      看起来它也适用于比纪元更早的日期,但我还没有彻底测试过。

      【讨论】:

        【解决方案3】:

        要处理 excel 日期值并在 sqlite3 中返回人类可读的日期,请考虑:

        -- unix epoch is 00:00:00 UTC on 1 January 1970 (1970/01/01)
        
        -- 86400 = Seconds in a day
        
        -- 25569 = Days between 1970/01/01 and 1900/01/01 (min date in Windows Excel)
        

        公式或语句:

        SELECT DATETIME(( EXCEL_DATE - 25569) * 86400 , 'unixepoch') AS UNIX_DATE;
        

        示例从最初问题中提供的 excel 日期开始:

        sqlite> SELECT DATETIME(( 40074 - 25569) * 86400 , 'unixepoch') AS UNIX_DATE;
        
        2009-09-18 00:00:00
        

        【讨论】:

          【解决方案4】:

          Excel 将日期存储为自 1899 年 12 月 30 日以来的天数,因此要将数字转换为日期/从日期转换,您只需计算 1899 年 12 月 30 日与您之后的日期之间的天数.如何做到这一点取决于您所使用的语言,但对于 C# 来说,以下方法会起作用:

          var epoch = new DateTime(1899, 12, 30);
          
          int number = 40074;
          var date = epoch.AddDays(number);
          Console.WriteLine(date);
          
          var date = new DateTime(1987, 5, 3);
          int number = (int) date.Subtract(epoch).TotalDays;
          Console.WriteLine(number);
          

          (如果您想知道为什么纪元是 1899 年 12 月 30 日,那是因为 实际 纪元应该是 1900 年 1 月 1 日,但 Excel 错误地假定 1900 年是闰年)

          【讨论】:

          • 对不起,我专门询问了在 SQLite 中工作的情况。我理解系统或使用其他语言没有问题(python 是我的最爱)。
          • 同样的原则适用;只是语法不同。
          • 实际上是 Lotus 123 使用 1900 年 1 月 1 日作为纪元,而错误地假设 1900 年是闰年。对于 Excel (VBScript),他们通过将纪元日期放回去来纠正这个问题。对于 1900 年 2 月 29 日之后的所有日期,Excel 和 Lotus 123 都同意,但它们之前的日期不同(但实际上 Excel 就在那里)。
          【解决方案5】:

          感谢@Aman_Srivastava,效果很好

          alter mytable add fixed_date DATE;
          
          update mytable set fixed_date = DATE(( excel_date - 25569) * 86400 , 'unixepoch') where excel_date is not null;
          

          【讨论】:

            猜你喜欢
            • 2019-03-29
            • 2012-11-30
            • 1970-01-01
            • 2013-04-20
            • 1970-01-01
            • 2020-05-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多