- 主题:如何将一个时间范围按15天拆分为多个时间段?
如何将一个时间范围按15天或30天拆分为多个时间段?
一个PGSQL数据库的一个表 有5000万行数据
它有一个时间类型的字段 这个时间字段有索引
查询 where create_date >= 2023-03-01 and create_date < 2023-04-30
很慢 10秒
但是
查询 where create_date >= 2023-03-01 and create_date < 2023-03-15
或者
查询 where create_date >= 2023-03-16 and create_date < 2023-03-30
很快 0.3秒
能不能这样:
03-01 ~ 03-15
union all
03-16 ~ 03-30
union all
03-31 ~ 04-14
union all
04-15 ~ 04-29
union all
04-30
或者不用union, 上面用5个线程并行 结果放到future里 然后合并5个结果。
但是 第一步就要将 03-01 ~ 04-30 按15天拆分,
百度、谷歌、问chatgpt 都给了错误答案 要么是最后一个时间段错了 要么是中间少一天……
这chatgpt也不是很靠谱。
下面这篇文章是按整月拆分,不是我想要的结果:
https://www.cnblogs.com/yyhhblog/p/14511410.html
下面这篇文章是按天拆分 比较接近
https://blog.csdn.net/python113/article/details/128793028
--
修改:townhope FROM 223.104.68.*
FROM 223.104.68.*
15很重要么?多一天的数据会影响多少?
如果影响不大,那就是15号分割就行,前面15天,后面剩余的,一个月分2段,很好理解
严格按照15天,估计过些日子就不好看了
--
FROM 120.244.216.*
有没有试过 WHERE create_date BETWEEN 2023-03-01 AND 2023-04-30,
看执行时间是多少。
【 在 townhope 的大作中提到: 】
: 如何将一个时间范围按15天或30天拆分为多个时间段?
: 一个PGSQL数据库的一个表 有5000万行数据
: 它有一个时间类型的字段 这个时间字段有索引
: ...................
--
FROM 119.233.241.*
按说 这两的 执行 计划 应该 没啥区别
【 在 callmebbser 的大作中提到: 】
: 有没有试过 WHERE create_date BETWEEN 2023-03-01 AND 2023-04-30,
: 看执行时间是多少。
:
: ...................
--
FROM 13.56.31.*
我粗略的感觉啊 这些时间不大准
冷数据的查询比较慢 搜过一次再搜 就快多了
也看这一段时间内 数据量有多大
50M行的库 不小 估计你的服务够大 内存撑的住并行搜
【 在 townhope 的大作中提到: 】
: 如何将一个时间范围按15天或30天拆分为多个时间段?
: 一个PGSQL数据库的一个表 有5000万行数据
: 它有一个时间类型的字段 这个时间字段有索引
: ...................
--
FROM 13.56.31.*
date_add(xxx, 15) 可以取15天之后
btw
month(create_date) in (3,4) and year(create_date)=2023
这样会不会快一些
【 在 townhope 的大作中提到: 】
: 如何将一个时间范围按15天或30天拆分为多个时间段?
: 一个PGSQL数据库的一个表 有5000万行数据
: 它有一个时间类型的字段 这个时间字段有索引
: ...................
--
修改:iwannabe FROM 119.139.198.*
FROM 119.139.198.*
你不能用程序去拆分时间吗?
然后用PreparedStatement去填充SQL里面需要的时间参数。
比如输入查询范围2023-03-01 到2023-04-30
你用Java把时间按15天打散,下面是Gpt给的例子。
public static void main(String[] args) {
// 将日期字符串解析为 LocalDate 对象
LocalDate date = LocalDate.parse("2023-03-01");
// 将日期加上15天
LocalDate result = date.plusDays(15);
// 输出结果
System.out.println(result);
}
然后依葫芦画瓢,循环去加15天,把时间传入去查询。
下面是gpt给的例子:
----------------------------------------------------------------------------------
mport java.time.LocalDate;
public class Main {
public static void main(String[] args) {
// 将日期字符串解析为 LocalDate 对象
LocalDate date = LocalDate.parse("2023-03-01");
// 循环加上15天,直到2023-04-30日
while (date.isBefore(LocalDate.parse("2023-05-01"))) {
// 输出加15天前的日期
System.out.println(date);
// 将日期加上15天
date = date.plusDays(15);
// 如果加15天后的日期超过了2023-04-30日,则将日期设置为2023-04-30日
if (date.isAfter(LocalDate.parse("2023-04-30"))) {
date = LocalDate.parse("2023-04-30");
}
// 输出加15天后的日期
System.out.println(date);
}
}
}
运行这段代码,将会输出以下结果:
2023-03-01
2023-03-16
2023-03-16
2023-03-31
2023-03-31
2023-04-15
2023-04-15
2023-04-30
----------------------------------------------------------------------------------
但是啊,我觉得像楼上兄弟说的,你这个可能是因为查询过了,所以快。不是因为时间间隔缩短了。
【 在 townhope 的大作中提到: 】
: 如何将一个时间范围按15天或30天拆分为多个时间段?
: 一个PGSQL数据库的一个表 有5000万行数据
: 它有一个时间类型的字段 这个时间字段有索引
: ...................
--
FROM 120.244.234.*
实在不行,加个字段。前15天标1,后边的标2。
糙快猛。
【 在 townhope 的大作中提到: 】
: 如何将一个时间范围按15天或30天拆分为多个时间段?
: 一个PGSQL数据库的一个表 有5000万行数据
: 它有一个时间类型的字段 这个时间字段有索引
: ...................
--
FROM 114.247.43.*