如何查询日期在 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`;
- 删除并创建文本 table(注意 Room 将名称(例如 table 和列)括在 `` 中(一个名为 table 的 table 会导致语法错误,因为它是关键字))
- 插入行进行测试
- 运行您的原始选择
- 运行两个解决方案选择(首先推荐)
- 清理环境
您遇到的第一个查询结果:-
第二个和第三个查询会产生您所期望的结果(尽管第二个查询带有使用 SQLite 可以处理的建议格式的附加列):-
和
您不妨参考https://sqlite.org/lang_datefunc.html
- 使用 Navicat 测试 SQLite。
我的一个 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`;
- 删除并创建文本 table(注意 Room 将名称(例如 table 和列)括在 `` 中(一个名为 table 的 table 会导致语法错误,因为它是关键字))
- 插入行进行测试
- 运行您的原始选择
- 运行两个解决方案选择(首先推荐)
- 清理环境
您遇到的第一个查询结果:-
第二个和第三个查询会产生您所期望的结果(尽管第二个查询带有使用 SQLite 可以处理的建议格式的附加列):-
和
您不妨参考https://sqlite.org/lang_datefunc.html
- 使用 Navicat 测试 SQLite。