仅更新 SQLite 列中的年份

Posted

技术标签:

【中文标题】仅更新 SQLite 列中的年份【英文标题】:Update only the year in SQLite column 【发布时间】:2013-10-17 20:35:32 【问题描述】:

我有一个 SQLite3 数据库,其中包含 366 行,以及一年中每一天的日期。我需要确保年份是当前的,如果不是,那么我需要将年份更新为当前日历年。我想做的是如下所示:

UPDATE daily SET date = DATE('%Y', 'now');

UPDATE daily SET date = strftime('%Y', 'now');

但是这些查询只是将日期列设为 NULL,即使它们确实按我预期的那样工作,我怀疑它是否会保留已经存在的日期和月份。

mysql 中,我可以执行UPDATE daily SET date = ADDDATE(date, INTERVAL 1 YEAR) 之类的操作——但首先,它不是一个有效的 SQLite 查询,其次,我需要更新到当前年份,而不是仅仅提高一年。

任何帮助将不胜感激。

【问题讨论】:

是否可以在数据库上运行 python/其他脚本? 不,不幸的是它不是,因为它是一个嵌入在移动应用程序中的数据库。我必须在应用启动时执行此逻辑,因此即使应用在某人的设备上休眠数年,日期也不会过时。 你能从应用程序中读取日期然后将它们写回数据库吗?或者创建一个自定义函数以从 SQL 调用? (***.com/questions/2108870/…)。使用大 strftime 函数可能有一种不明显的方法,但似乎只使用非 sql 代码会更省力。 【参考方案1】:

试试这个:

create table t (id int, d text);

insert into t
select 1, date('2011-01-01') union
select 2, date('2012-03-11') union
select 3, date('2013-05-21') union
select 4, date('2014-07-01') union
select 5, date('2015-11-11');

select * from t;

update t set
    d = date(strftime('%Y', date('now')) || strftime('-%m-%d', d));

select * from t;

它使用Date And Time Functions。首先从字段 (strftime('-%m-%d', d)) 中获取月份和日期,然后添加(连接)当前年份 (strftime('%Y', date('now'))) 并将其转换为日期。

SQL Fiddle live example.

【讨论】:

谢谢您,先生!你让我今天一整天都感觉很好。它不仅效果很好,而且我能够从你的解释中学习。

以上是关于仅更新 SQLite 列中的年份的主要内容,如果未能解决你的问题,请参考以下文章

SQLite、FTS、MATCH 和分隔列中的文本

SQLite 约束

如何根据日期列中的月份从 SQLite 中获取数据

从 SQLITE 中的两列中选择不同的值

如何仅在创建时将值插入数据库?(SQLite Android Studio)

SQLite 替换现有列中的数据