为什么'%d-%m-%Y'格式始终返回NULL?

时间:2018-08-13 23:38:54

标签: sqlite

我的日期格式为('INSERT INTO `users` (`crdate`, `description`, `first_name`) SELECT `t1`.`crdate`, `t1`.`description`, `t1`.`first_name` FROM `users` AS `t1`', []) SELECT `t1`.`crdate`, `t1`.`description`, `t1`.`first_name` FROM `users` AS `t1`; 2018-08-12 16:50:36 valid Heinz 2018-08-12 19:34:45 valid Hilde 2018-08-12 19:33:31 invalid Paul

此表达式返回31/01/1970

%d/%m/%Y

我认为NULL字符可能有问题,而且

SELECT strftime('%d/%m/%Y','31/01/1970')

返回/

唯一可行的表达方式是

SELECT strftime('%d-%m-%Y','31-01-1970')

为什么?

PS:实际上,从sqlite3控制台出现语法错误。

1 个答案:

答案 0 :(得分:2)

您误解了strftime的工作方式。 this link期望其时间参数采用ISO8601格式(即,日期为YYYY-MM-DD),然后使用格式字符串格式化该时间。

strftime不是用于解析日期和时间,而是用于格式化它们。

如果您想将'31/01/1970'解析为SQLite可以使用的格式,那么您就被substr所困扰:

select substr('31/01/1970', 7, 4) || '-' || substr('31/01/1970', 4, 2) || '-' ||  substr('31/01/1970', 1, 2);

,然后您可以将该字符串输入strftime中以对其进行格式化:

select strftime('%d/%m/%Y', substr('31/01/1970', 7, 4) || '-' || substr('31/01/1970', 4, 2) || '-' ||  substr('31/01/1970', 1, 2));