英文:
SQLite filter records by part of column value
问题
背景:
以下是我拥有的表:
Persons表:
Id 姓名
-------------
1 用户1
2 用户2
Orders表:
Id 姓名 日期 年月 用户Id
----------------------------------------------------------------------
1 项目1 2015-11-01 02:34:46 2015-11 2
2 项目2 2018-09-06 01:04:16 2018-09 1
3 项目3 2018-09-23 04:44:21 2018-09 1
4 项目4 2018-09-02 11:10:08 2018-09 2
5 项目5 2019-11-01 02:54:02 2019-11 1
在用户界面上,我为每个用户定义了一个微调器(spinner),其中填充了订单表的“年月”列。
例如,对于“用户1”,微调器将填充以下内容:
- 2019-11
- 2018-09
我使用以下查询填充微调器:
Cursor cursor = db.query("orders", new String[] {"YearMonth"}, "UserId = "+id,
null, "YearMonth", null, "YearMonth DESC");
// id是存储特定用户id的局部变量
每当我从微调器中选择任何年月时,所有在该年月购买的订单都会通过以下查询返回:
Cursor cursor = db.query("orders", null, "UserId = ? and YearMonth = ?",
new String[] {id+"", selectedYearMonth}, null, null, null);
// selectedYearMonth是当前选定的微调器值。
问题:
如果您仔细观察,订单表中的“年月”列是不必要的,我只需使用日期列就可以表示订单的年份和月份,这就是我想要您的帮助的地方。
您能否向我展示一种正确的方法,通过日期列的一部分筛选上述查询,而无需为仅筛选记录而定义不必要的“年月”列?
英文:
Background:
Following are the tables that I have:
Persons table:
Id Name
-------------
1 user1
2 user2
Orders table:
Id Name Date YearMonth UserId
----------------------------------------------------------------------
1 item1 2015-11-01 02:34:46 2015-11 2
2 item2 2018-09-06 01:04:16 2018-09 1
3 item3 2018-09-23 04:44:21 2018-09 1
4 item4 2018-09-02 11:10:08 2018-09 2
5 item5 2019-11-01 02:54:02 2019-11 1
On the UI side I have defined a spinner for each user which is populated with YearMonth
column of orders table.
For example for user1
the spinner would be populated with:
- 2019-11
- 2018-09
I use this query to populate the spinner:
Cursor cursor = db.query("orders",new String[] {"YearMonth"}, "UserId = "+id,
null, "YearMonth", null, "YearMonth DESC");
// id is a local variable which stores the id of a particular user
And whenever I select any of the YearMonth from the spinner all the orders brought on that year and month get returned with this query:
Cursor cursor = db.query("orders",null,"UserId = ? and YearMonth = ?",
new String[] {id+"", selectedYearMonth}, null, null, null);
// selectedYearMonth is the value of spinner which is currently selected.
Problem:
If you notice carefully the column YearMonth
in orders table is unnecessary I could have done the same with just date column which also mentions the year and month of orders and this is where I want your help.
Can you show me a right way with which I can filter the above queries with part of date column without the need of defining the unnecessary YearMonth column for just filtering the records ?
答案1
得分: 1
你可以使用函数 SUBSTR()
从列 Date
中返回一个列的别名为 YearMonth
,以获取日期的前7个字符:
Cursor cursor = db.rawQuery(
"SELECT SUBSTR(Date, 1, 7) YearMonth FROM orders WHERE UserId = ? ORDER BY YearMonth DESC",
new String[] {id + ""}
);
而你的第二个查询将是:
Cursor cursor = db.rawQuery(
"SELECT * FROM orders WHERE UserId = ? AND SUBSTR(Date, 1, 7) = ?",
new String[] {id + "", selectedYearMonth}
);
英文:
You can return a column aliased YearMonth
from the column Date
by using the function SUBSTR()
, to get the first 7 chars of the date:
Cursor cursor = db.rawQuery(
"SELECT SUBSTR(Date, 1, 7) YearMonth FROM orders WHERE UserId = ? ORDER BY YearMonth DESC",
new String[] {id + ""}
);
and your 2nd query will be:
Cursor cursor = db.rawQuery(
"SELECT * FROM orders WHERE UserId = ? AND SUBSTR(Date, 1, 7) = ?",
new String[] {id + "", selectedYearMonth}
);
答案2
得分: 0
你可以轻松地查询日期时间,请查看这个链接和与你的问题相关的答案。
SELECT
InvoiceId,
BillingAddress,
date(InvoiceDate) InvoiceDate,
Total
FROM
invoices
WHERE
InvoiceDate NOT BETWEEN '2009-01-03' AND '2013-12-01'
ORDER BY
InvoiceDate;
另一个例子:
SELECT ord_num, ord_amount, ord_date, cust_code, agent_code
FROM orders
WHERE ord_date NOT BETWEEN '2008-08-02' AND '2008-30-02';
SQLite支持以下五个日期和时间函数:
- date(timestring, modifier, modifier, ...)
- time(timestring, modifier, modifier, ...)
- datetime(timestring, modifier, modifier, ...)
- julianday(timestring, modifier, modifier, ...)
- strftime(format, timestring, modifier, modifier, ...)
请确保检查你创建表格的方式,你的Date列必须是一个DateTime字段。希望这能帮助你。如果有任何反馈,请告诉我,我可以继续帮助你。
英文:
You can query date time with ease, please have a look at this and answer relates to your problem
SELECT
InvoiceId,
BillingAddress,
date(InvoiceDate) InvoiceDate,
Total
FROM
invoices
WHERE
InvoiceDate NOT BETWEEN '2009-01-03' AND '2013-12-01'
ORDER BY
InvoiceDate;
Another example
SELECT ord_num, ord_amount, ord_date, cust_code, agent_code
FROM orders
WHERE ord_date NOT BETWEEN '2008-08-02' AND '2008-30-02';
SQLite supports five date and time functions as follows:
- date(timestring, modifier, modifier, ...)
- time(timestring, modifier, modifier, ...)
- datetime(timestring, modifier, modifier, ...)
- julianday(timestring, modifier, modifier, ...)
- strftime(format, timestring, modifier, modifier, ...)
better check how you creating the table, your Date column must be a DateTime field.
hope this helps. give any feedback so I can help you further.
答案3
得分: 0
根据 @forpas 的解决方案进行了修改,以最适应该问题:
修改了 Spinner 的查询:
Cursor cursor = db.query("orders", new String[] {"SUBSTR(orderDate, 1, 7) YearMonth"},
"userId = ?", new String[] {String.valueOf(personId)},
"YearMonth", null, "YearMonth DESC");
修改了获取订单的查询:
Cursor cursor = db.query("orders", null, "userId = ? and SUBSTR(orderDate, 1, 7) = ?",
new String[] {personId+"", item}, null, null, null);
英文:
Modified the solution of @forpas to best suite the Question:
Modified query for Spinner:
Cursor cursor = db.query("orders", new String[] {"SUBSTR(orderDate, 1, 7) YearMonth"},
"userId = ?", new String[] {String.valueOf(personId)},
"YearMonth", null, "YearMonth DESC");
Modified query of getting orders:
Cursor cursor = db.query("orders",null,"userId = ? and SUBSTR(orderDate, 1, 7) = ?",
new String[] {personId+"", item}, null, null, null);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论