首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >搜索一系列日期时间条目

搜索一系列日期时间条目
EN

Stack Overflow用户
提问于 2016-12-06 03:53:55
回答 1查看 62关注 0票数 0

我想解决一个奇怪的问题。

在我的模型中,我有一个start_time和和end_time,我们将这个模型称为“成本”。它与一件物品有关。

该项目将在一天中改变价格,所以周一从早上5点到下午1点,这是一个价格,从下午1点到下午5点--这是另一种价格。然后,它在下午5点到6点之间不可用,在第二天下午7点到凌晨2点之间有第3种价格。

表示这些数据并不困难,我有一个包含成本和开始/结束时间的表。

问题是,我有一个固定的项目数,和可变的时间成本。

我可以搜索和检查,以确保我有项目在一个时间段内可用,并确保它实际上是“可租的”在这段时间。

如何处理跨多行的查询(4 4pm 7 4pm,可能会失败,或6:00-3 4pm,将通过),以确保连续的时间间隔可用?

如何处理跨表行的检查并确保它们是连续的?这类问题有名字吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-06 10:26:21

我会用范围类型。

作为一个例子,我将假设您的表定义如下:

代码语言:javascript
运行
复制
CREATE TABLE item_data (
   id integer PRIMARY KEY,
   start_time timestamp with time zone NOT NULL,
   end_time timestamp with time zone NOT NULL,
   available boolean NOT NULL,
   price NUMERIC(10,2)
);

然后,您可以在上午6点至下午3点之间查询项目1的可用性,如下所示:

代码语言:javascript
运行
复制
WITH q(i) AS
   (SELECT tstzrange '[2016-12-06 06:00:00, 2016-12-06 15:00:00)')
SELECT
   COALESCE(
      /*
       * Calculate the sum of the lengths of the intersection
       * between the time intervals and our given interval.
       */
      sum(
         upper(tstzrange(start_time, end_time, '[)') * q.i)
         - lower(tstzrange(start_time, end_time, '[)') * q.i)
      ),
      interval '0 hours'
   )
   /*
    * The item is available all the time if the above sum
    * is equal to the length of the given interval.
    */
   = upper(q.i) - lower(q.i)
FROM item_data, q
WHERE item_data.id = 1
   /* only consider times where the item is available */
   AND item_data.available
   /* only consider times that overlap with our given interval */
   AND tstzrange(item_data.start_time, item_data.end_time, '[)') && q.i
GROUP BY q.i;

如果项目1始终可用,这将返回TRUE,如果没有,则返回FALSE

该查询假设数据是一致的,即在给定时间对给定项不存在一个以上的当前状态。

其他查询,如检查数据的一致性,也可以类似地处理。

如果选择将间隔表示为tstzrange类型的一个值,而不是两个时间戳,则查询会更简单。我建议你这么做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40987545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档