当前位置: 首页 > 面试题库 >

表中开始日期和结束日期在Postgres中的generate_series

窦夜洛
2023-03-14
问题内容

我一直在尝试从时间戳字段中的第一个日期到最后一个日期生成一系列日期(YYYY-MM-DD
HH)。我已经有了generate_series()所需的内容,但是在尝试从表中获取开始日期和结束日期时遇到了一个问题。我有以下一个大概的想法:

with date1 as
(
SELECT start_timestamp as first_date
FROM header_table
ORDER BY start_timestamp DESC
LIMIT 1
),
date2 as
(
SELECT start_timestamp as first_date
FROM header_table
ORDER BY start_timestamp ASC    
LIMIT 1
)
    select generate_series(date1.first_date, date2.first_date
                         , '1 hour'::interval)::timestamp as date_hour

from
(   select * from date1
    union
    select * from date2) as foo

Postgres 9.3


问题答案:

您不需要CTE,这将比必要的成本更高。
而且您不需要强制转换为timestamp,当您向类型提供数据时,结果已经
数据类型。详细信息在这里:timestamp``timestampgenerate_series()

  • 在PostgreSQL中生成两个日期之间的时间序列

在Postgres 9.3 或更高版本中,您可以使用LATERAL联接:

SELECT to_char(ts, 'YYYY-MM-DD HH24') AS formatted_ts
FROM  (
   SELECT min(start_timestamp) as first_date
        , max(start_timestamp) as last_date
   FROM   header_table
   ) h
  , generate_series(h.first_date, h.last_date, interval '1 hour') g(ts);

(可选)使用,to_char()以您提到的格式将结果作为文本形式获得。

这适用于 任何 Postgres版本:

SELECT generate_series(min(start_timestamp)
                     , max(start_timestamp)
                     , interval '1 hour') AS ts
FROM   header_table;

通常更快一些。
调用SELECT列表中的返回集合的函数是一种非标准的SQL功能,有些人对此并不满意。此外,最终在Postgres
10中修复了行为异常(尽管不是针对这种简单情况)。

注意NULL 处理方面的细微差别:

相当于

max(start_timestamp)

是用

ORDER BY start_timestamp DESC **NULLS LAST**
LIMIT 1

如果没有NULLS LASTNULL值来 首次 在从大到小的顺序(如果有 _可能_是空值start_timestamp)。您将获得NULL,last_date而查询将变为空。



 类似资料:
  • 问题内容: 我想检查日期是否在开始日期和结束日期之间。 我添加了一个where子句 但问题在于它不包含“ 2010-04-15”。 它应该包括结束日期,我该怎么办? 请帮我 问候, 潘卡 问题答案: 明确指定时间部分:

  • 如何先按开始日期在fullCalendar中排序事件? 示例: 首先开始的事件将显示在顶部,随后开始的事件将显示在后面 如果两个事件的开始日期相同,则按结束日期对它们进行排序,即先显示一个较早结束的事件,然后显示一个较晚结束的事件。 日历显示事件顺序

  • 问题内容: 我在从表中显示正确的数据时遇到了麻烦。我不太确定要搜索什么。我不确定min(column)或max(column)在这里对我有帮助。让我们看看我是否可以解释我的问题。 我的表包含以下数据: 我将以一种观点来介绍这一点。它将按代码分组。 我想要的是此输出: 如您所见,DateTo和DateFrom之间是否存在间隙,我希望将其显示为两行。但是,如果具有相同代码的下一个“ DateFrom”

  • 问题内容: 好吧,假设我有一个看起来像这样的表: 任何人都有关于如何查询它的想法,因此数据看起来像 问题答案: 我不会将ID放在这里,因为我认为它与查询无关。如果您愿意,请稍后再说。这是一个MSSQL查询。 可以很容易地将其翻译为其他数据库类型。

  • 我试图找出明星日期和结束日期的员工时钟。以下是我所掌握的数据示例。 需要输出: 我必须根据eventtime和activitycode找到此人的开始日期和结束日期。开始日期将是事件时间列,我必须从行中下一个事件时间的同一列计算结束日期。 我曾尝试在T-SQL中使用lead函数,但它并没有给出我想要的结果。 如果有人知道如何处理这个问题,我会非常感激。

  • 问题内容: 我正在尝试使用周日作为开始日期以及参考日期(例如)来获取星期范围,但是我似乎无法弄清楚。 例如,如果我将$ date设置为2009-05-01,则将获得2009-04-26和2009-05-02。2009-05-10将产生2009-05-10和2009-05-16。我当前的代码如下所示(我不记得我从何处提起它,因为我忘记在评论中放下网址): 我意识到它所做的只是将当前日期增加了7天。你