无法从数据库sqlite获取格式化日期

时间:2018-06-10 16:39:57

标签: android sqlite android-sqlite

我有一个带有timestamp列的表,存储在timestamp列中的值类似于

20180608T002304.507Z,20180608T001745.821Z,20180608T001628.170Z,20180608T001336.516Z

我想在“ YYYY-MM-dd ”格式中获得时间戳。

使用了strftime()函数,但没有使用

当我查询 strftime('%Y-%m-%d%H:%M',时间戳)获取 null

提前致谢

2 个答案:

答案 0 :(得分:0)

这不是supported time string formats之一。更改值,使其包含适当的标点符号:

sqlite> SELECT date('20180608T002304.507Z');

sqlite> SELECT date('2018-06-08T00:23:04.507Z');
2018-06-08

答案 1 :(得分:0)

您的问题是strftime以及所有SQLite日期函数都需要下面列出的特定格式。 20180608T002304.507Z不是其中一种格式,因此为null。

  • 注意以下是基于您使用 strftime的查询('%Y-%m-%d%H:%M',时间戳)而不是我希望时间戳在" YYYY-MM-dd"甲酸盐。

您有两种选择。

1。您可以使用 substr 功能,例如

: -

substr(mytimestamp,1,4)||'-'||
substr(mytimestamp,5,2)||'-'||
substr(mytimestamp,7,2)||' ' ||
substr(mytimestamp,10,2)||':'||
substr(mytimestamp,12,2)
  • 其中mytimestamp是列名

例如,以下内容: -

DROP TABLE IF EXISTS mytable;
CREATE TABLE IF NOT EXISTS mytable (mytimestamp);
INSERT INTO mytable VALUES('20180608T002304.507Z'),('20180608T001745.821Z'),('20180608T001628.170Z'),('20180608T001336.516Z');
SELECT 
    substr(mytimestamp,1,4)||'-'||
    substr(mytimestamp,5,2)||'-'||
    substr(mytimestamp,7,2)||' ' ||
    substr(mytimestamp,10,2)||':'||
    substr(mytimestamp,12,2)
FROM mytable;

导致: -

enter image description here

2。更改源数据以匹配其中一种可接受/已识别的格式。

这可以使用基于以下内容的东西来完成: -

UPDATE mytable SET mytimestamp = 
    substr(mytimestamp,1,4)||'-'|| -- Year
    substr(mytimestamp,5,2)||'-'|| -- Month
    substr(mytimestamp,7,2)|| -- Day
    substr(mytimestamp,9,1)||      -- T (or space)
    substr(mytimestamp,10,2)||':'||
    substr(mytimestamp,12,2)||':'||
    substr(mytimestamp,14)
    ;
  • 这基于上面创建的表格。

运行更新后,使用: -

SELECT  strftime('%Y-%m-%d %H:%M', mytimestamp) FROM mytable;

导致: -

enter image description here

  

时间字符串时间字符串可以采用以下任何格式:

     
      
  1. YYYY-MM-DD
  2.   
  3. YYYY-MM-DD HH:MM
  4.   
  5. YYYY-MM-DD HH:MM:SS
  6.   
  7. YYYY-MM-DD HH:MM:SS.SSS
  8.   
  9. YYYY-MM-DDTHH:MM
  10.   
  11. YYYY-MM-DDTHH:MM:SS
  12.   
  13. YYYY-MM-DDTHH:MM:SS.SSS
  14.   
  15. HH:MM
  16.   
  17. HH:MM:SS
  18.   
  19. HH:MM:SS.SSS
  20.   
  21. 现在
  22.   
  23. DDDDDDDDDD
  24.         

    在格式5到7中," T"是一个分隔的文字字符   日期和时间,根据ISO-8601的要求。格式8到10表示   仅指定假定日期为2000-01-01的时间。格式11,字符串   ' now',被转换为从中获得的当前日期和时间   正在使用的sqlite3_vfs对象的xCurrentTime方法。现在'   日期和时间函数的参数总是返回完全相同   同一sqlite3_step()调用中多次调用的值。   使用通用协调时间(UTC)。格式12是朱利安日   数字表示为浮点值。

         

    格式2到10可以可选地后跟一个时区   形式的指标" [+ - ] HH:MM"或只是" Z"。日期和时间   函数使用UTC或" zulu"内部时间,所以" Z"后缀是   无操作。任何非零" HH:MM"从指示中减去后缀   日期和时间,以计算祖鲁时间。例如,所有的   以下时间字符串是等效的:

         
        
    • 2013-10-07 08:23:19.120
    •   
    • 2013-10-07T08:23:19.120Z
    •   
    • 2013-10-07 04:23:19.120-04:00
    •   
    • 2456572.84952685
    •   
         

    在格式4,7和10中,SS.SSS可以具有小数秒值   小数点后面的一个或多个数字。正好是三位数   在示例中显示,因为只有前三个数字   结果很重要,但输入字符串可以有更少或更多   超过三位数,日期/时间功能仍然可以运行   正确。同样,格式12显示有10位有效数字,   但日期/时间功能真的会接受尽可能多的   代表朱利安日数所必需的数字。

SQL As Understood By SQLite - Date And Time Functions