如何查询日期在 12 天内结束的 sqlite 数据库?

How to query sqlite database where date ends in 12 days?

我的一个 SQLiteDatabase 查询有问题。
我想向用户显示日期在 12 天后结束的内容。看起来像:
@Query("SELECT ID, NAME_PRODUCT, AMOUNT, DATE_EXP FROM Table WHERE date_exp not null AND date_exp <= DATE('now', '+12 days') ORDER BY date_exp ASC")
但它打印的日期晚于例如 (18-06 到 20-06) 21-06 的范围。我希望从今天开始日期在 12-06 中最大结束的元素。那么问题出在哪里呢? 我还想显示日期 已经结束 的元素。那我该怎么做呢? 我只会补充一点,我将数据存储为 String.

问题

I will only add that I store data as String.

您使用的日期格式似乎不是直接排序table 或使用大于 than/less 的类型表达式进行比较。尤其不能直接与 date('now',...).

进行比较

例如18-06 大于 01-07 因为日期优先级更高(1 大于 0)。

此外,date('now','+12 days') 会在 01-07-2021 return/resolve 到 2021-07-13 所以 18-?? (任何月份)只会小于小于或等于 1799-12-31 的日期。 (由于任何数字字符(0 .... 9)大于-

修复 1(以更友好的格式存储数据)

一种推荐的解决方案是以 YYYY-MM-DD 格式存储数据。然后您的比较将起作用,日期和时间函数也将起作用(例如下面使用的 strftime 以及您使用的 date

  • 请参阅末尾的 link,了解 date/time 格式和内置函数

如果使用这种格式的日期,那么您可以使用(您的查询):-

@Query("SELECT ID, NAME_PRODUCT, AMOUNT, DATE_EXP FROM Table WHERE date_exp not null AND date_exp <= DATE('now', '+12 days') ORDER BY date_exp ASC")

修复2(处理不友好的格式)

另一种不推荐的选择(因为您可能会遇到类似的问题)是,假设只有 DD-MM 格式(多年来不适合)将使用 substr(date_exp,4,2)||'-'||substr(date_exp,1,2) 来转换DD-MM 格式转换为 MM-DD 并使用 substr(date('now','+12 days'),6,5)strftime('%m-%d','now','+12 days').

因此可以使用以下内容:-

@Query("SELECT ID, NAME_PRODUCT, AMOUNT, DATE_EXP FROM `Table` WHERE date_exp not null AND substr(date_exp,4,2)||'-'||substr(date_exp,1,2) <= substr(date('now','+12 days'),6,5) ORDER BY substr(date_exp,4,2)||'-'||substr(date_exp,1,2) ASC")

在原生 SQLite

中工作 example/demo

以下SQL:-

DROP TABLE IF EXISTS `table`;
CREATE TABLE IF NOT EXISTS `table` (id INTEGER PRIMARY KEY, name_product TEXT, amount REAL, date_exp TEXT, other_date_exp TEXT);
INSERT INTO `table` VALUES
    (null,'blah',25.12,'18-06','2021-06-18') /* XXX Should not be in result */
    ,(null,'blah',25.12,'18-06','2022-06-18') /* XXX Should not be in result */
    ,(null,'blah',25.12,'18-05','2021-05-18') /* Should be in result */
    ,(null,'blah',25.12,null,null) /* XXX Should not be in result */
    ,(null,'blah',25.12,'19-05','2021-05-19') /* Should be in result */
    ,(null,'blah',25.12,'20-05','2021-05-20') /* Should be in result */
;

SELECT ID, NAME_PRODUCT, AMOUNT, DATE_EXP FROM `Table` WHERE date_exp not null AND date_exp <= DATE('now', '+12 days') ORDER BY date_exp ASC;
SELECT ID, NAME_PRODUCT, AMOUNT, other_date_exp FROM `Table` WHERE other_date_exp not null AND other_date_exp <= DATE('now', '+12 days') ORDER BY other_date_exp ASC;
SELECT ID, NAME_PRODUCT, AMOUNT, DATE_EXP FROM `Table` WHERE date_exp not null AND substr(date_exp,4,2)||'-'||substr(date_exp,1,2) <= substr(date('now','+12 days'),6,5) ORDER BY substr(date_exp,4,2)||'-'||substr(date_exp,1,2) ASC;
DROP TABLE IF EXISTS `table`;
  1. 删除并创建文本 table(注意 Room 将名称(例如 table 和列)括在 `` 中(一个名为 table 的 table 会导致语法错误,因为它是关键字))
  2. 插入行进行测试
  3. 运行您的原始选择
  4. 运行两个解决方案选择(首先推荐)
  5. 清理环境

您遇到的第一个查询结果:-

第二个和第三个查询会产生您所期望的结果(尽管第二个查询带有使用 SQLite 可以处理的建议格式的附加列):-

您不妨参考https://sqlite.org/lang_datefunc.html

  • 使用 Navicat 测试 SQLite。