gpt4 book ai didi

sql - sqlite中有效的日期比较?

转载 作者:行者123 更新时间:2023-12-03 19:44:38 24 4
gpt4 key购买 nike

该查询花费的时间太长(800mhz cpu上超过15000条记录):

select count(*) from events where millis  >  date("now", "start of month")


该字段定义为 millis INT,当我运行查询(或我提出的任何其他变体)时,sqlite似乎会对它比较的每条记录进行日期转换。我看到了strace:

read(3, "\r\0\0\0\21\0H\0\3\310\3\220\3X\3 \2\350\2\260\2x\2@\2\10\1\320\1\230\1`"..., 1024) = 1024
gettimeofday({1399595165, 605812}, NULL) = 0
gettimeofday({1399595165, 609833}, NULL) = 0
gettimeofday({1399595165, 611851}, NULL) = 0
gettimeofday({1399595165, 618546}, NULL) = 0
gettimeofday({1399595165, 623135}, NULL) = 0
gettimeofday({1399595165, 626291}, NULL) = 0
gettimeofday({1399595165, 634558}, NULL) = 0
gettimeofday({1399595165, 636463}, NULL) = 0
gettimeofday({1399595165, 638986}, NULL) = 0
gettimeofday({1399595165, 669426}, NULL) = 0
gettimeofday({1399595165, 675431}, NULL) = 0
...
And it keeps running


有没有一种有效的方法来获取当前日期的记录计数,将“ now”仅转换一次为int,然后再进行简单的数学运算?

编辑:正如CL所指出的,仅通过预先计算日期就足够了。无需将其强制转换为int。下面的方法工作更快(无日期比较):

select date( "now", "-1 day");
2014-05-08
sqlite> select count(millis) from events where millis > "2014-05-08";
1177


极大地提高了性能的另一件事是在列上创建了索引,就像在任何其他数据库引擎上所做的一样。不知道为什么我认为SQLite不支持它们。

仅作记录:

sqlite> create index ievemts_millis on events (millis);
sqlite> select date( "now", "-1 day");
2014-05-08
sqlite> select count(millis) from events where millis > "2014-05-08";
1177

最佳答案

对于这样的简单值,可以使用两个查询:

SELECT date('now', 'start of month');

SELECT COUNT(*) FROM events WHERE millis > ?;


(仅在应用程序的代码中计算毫秒值可能会更容易。)

最近足够的SQLite版本将只评估 date函数一次。

关于sql - sqlite中有效的日期比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23554894/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com