Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何使用日期优化sqlite查询&;替代品?_Objective C_Iphone_Performance_Sqlite - Fatal编程技术网

Objective c 如何使用日期优化sqlite查询&;替代品?

Objective c 如何使用日期优化sqlite查询&;替代品?,objective-c,iphone,performance,sqlite,Objective C,Iphone,Performance,Sqlite,我有一些sqlite查询正在减慢我的iPhone应用程序的速度 我在我的应用程序中重复了两种模式。第一个是substr: SELECT Id FROM [Table] WHERE UPPER(substr(Name,1,1))='A' ORDER BY Name" (这是字母表的市长级别。是联系人列表) 另一个是带有日期的复杂版本: SELECT Id,customerCode, case when DueDate>=datetime('now','-100 years') AND D

我有一些sqlite查询正在减慢我的iPhone应用程序的速度

我在我的应用程序中重复了两种模式。第一个是substr:

SELECT Id FROM [Table] WHERE UPPER(substr(Name,1,1))='A' ORDER BY Name"
(这是字母表的市长级别。是联系人列表)

另一个是带有日期的复杂版本:

SELECT Id,customerCode, 
case
when DueDate>=datetime('now','-100 years') AND DueDate<=datetime('now','-1 days') then 'Past due'
when DueDate<datetime('now') then 'Today'
when DueDate>=datetime('now') AND DueDate<=datetime('now','15 days') then '15'
when DueDate>=datetime('now','16 days') AND DueDate<=datetime('now','30 days') then '30'
when DueDate>=datetime('now','31 days') AND DueDate<=datetime('now','45 days') then '45'
when DueDate>=datetime('now','46 days') AND DueDate<=datetime('now','60 days') then '60'
when DueDate>=datetime('now','61 days') AND DueDate<=datetime('now','90 days') then '90'
when DueDate>=datetime('now','91 days') then '> 90'
end As Key, 
COUNT(*) As Total, TimeStamp
FROM debt
GROUP BY customerCode,
case
when DueDate>=datetime('now','-100 years') AND DueDate<=datetime('now','-1 days') then '-1'
when DueDate<datetime('now') then 'Today'
when DueDate>=datetime('now') AND DueDate<=datetime('now','15 days') then '15'
when DueDate>=datetime('now','16 days') AND DueDate<=datetime('now','30 days') then '30'
when DueDate>=datetime('now','31 days') AND DueDate<=datetime('now','45 days') then '45'
when DueDate>=datetime('now','46 days') AND DueDate<=datetime('now','60 days') then '60'
when DueDate>=datetime('now','61 days') AND DueDate<=datetime('now','90 days') then '90'
when DueDate>=datetime('now','91 days') then '> 90'
end
选择Id、客户代码、,
案例

当DueDate>=datetime('now','-100 years')、DueDate=datetime('now','-100 years')和DueDate时,我不知道性能比较如何,但有另一种编写第一个查询的方法

SELECT Id FROM [Table] WHERE Name LIKE "a%"
因为%匹配以a或a开头的任何字符串,后跟任意数量的字符

有关更多参考,请参阅

其次,我猜您在重复调用datetime时会受到性能影响。你能把它压缩成一个单一的数学运算,然后用简单的数学运算符比较几天内的差异吗?例如,自去年圣诞节以来的天数:

sqlite> select julianday('now') - julianday('2008-12-05');
212.743649386801

SQLite在内部以字符串的形式存储日期,因此每次调用
datetime
时,它都必须完全解析日期字符串,等等。

您不必重复该
CASE
操作符两次——只需按客户代码分组,键就足够了。此外,正如@Mark所建议的,
大小写
可能可以通过使用julianday中的差异来优化,而名称选择可以利用
LIKE
默认情况下不区分大小写这一事实(只要您只需要ASCII字母——唉,sqlite中有一个记录在案的错误,即这种大小写不敏感在ASCII之外不能正常工作)。

对于类似的查询,只需花费2秒。