SQLite使用STRFTIME提取年份异常:返回NULL或-4707求助
SQLite日期字段提取年份问题解决
问题原因分析
- 执行
SELECT STRFTIME('%Y', '2023');返回NULL:因为'2023'不是SQLite日期函数可识别的有效格式,STRFTIME仅支持解析符合ISO 8601规范的完整日期/时间字符串(如YYYY-MM-DD、YYYY-MM-DD HH:MM:SS等),单独年份无法被判定为合法日期。 - 执行
SELECT STRFTIME('%Y', '2023-1-1');返回-4707:这是SQLite对不规范日期格式(月份/日期为单数字)的解析异常,导致被错误识别为公元前年份。
正确解决方案
规范日期存储格式
存储日期时统一使用YYYY-MM-DD格式(月份和日期补为两位数字,如2023-01-01),此时STRFTIME可正常提取年份:SELECT STRFTIME('%Y', '2023-01-01'); -- 返回 '2023'修复已存在的不规范日期
如果数据库中已有YYYY-M-D格式的日期,可通过DATE()函数先标准化格式,再提取年份:SELECT STRFTIME('%Y', DATE('2023-1-1')); -- 返回 '2023'DATE()函数能自动识别并转换部分不规范格式为标准YYYY-MM-DD,让STRFTIME正常工作。直接字符串截取年份
若日期字段格式固定为YYYY或YYYY-M-D,也可跳过日期解析,直接截取字符串获取年份:-- 从'2023'提取年份 SELECT SUBSTR('2023', 1, 4); -- 返回 '2023' -- 从'2023-1-1'提取年份 SELECT SUBSTR('2023-1-1', 1, 4); -- 返回 '2023'
内容的提问来源于stack exchange,提问作者mune72
相关产品推荐
相关产品推荐

