如何在SQLite中仅更新timestamp列年份为2025(保留月日时分秒)
如何在SQLite中将timestamp列的年份更新为2025并保留月日时分秒
需求说明
需要将SQLite表t中d列(timestamp类型)的年份统一替换为2025,同时保留原日期的月份、日期、小时、分钟、秒信息。
原语句问题分析
你尝试的SQL语句存在两处关键错误:
datetime(2059)是无效的日期格式,无法正确生成年份字符串;- 仅提取了原日期的
-%m-%d部分,漏掉了时间信息%H:%M:%S,会导致时间部分丢失。
正确SQL语句
以下两种方法都可以实现需求,推荐第一种更直观的写法:
方法一:直接拼接年份与原日期的月日时分秒部分
UPDATE t SET d = datetime('2025-' || strftime('%m-%d %H:%M:%S', d));
原理:
strftime('%m-%d %H:%M:%S', d)从原日期中提取出-MM-DD HH:MM:SS格式的子串;- 与固定年份
2025拼接后,形成完整的目标日期时间字符串; datetime()函数将拼接后的字符串转换为SQLite支持的日期时间类型,确保数据格式合法。
方法二:通过年份偏移计算更新
UPDATE t SET d = datetime(d, 'start of year', '+' || (2025 - strftime('%Y', d)) || ' years');
原理:
strftime('%Y', d)获取原日期的年份;- 计算目标年份2025与原年份的差值,通过
+N years的偏移量将原日期年份调整为2025; 'start of year'确保从年份起始点计算偏移,避免因闰年等特殊情况导致日期异常。
验证效果
执行上述语句后,原数据会被更新为期望结果:
2025-01-01 09:30:00 2025-03-06 12:00:00 2025-01-01 17:24:00 2025-07-03 04:30:00 2025-01-01 05:50:00 2025-09-03 06:30:00 2025-01-01 23:30:00 2025-01-01 08:30:00 2025-01-01 09:30:00
内容的提问来源于stack exchange,提问作者gisgeospatialworld
相关产品推荐
相关产品推荐

