1

在 PostgreSQL 中,我有一个文本列,其中包含以这种格式表示事件的开始和停止时间的值:“15:00-17:00”(例如,这是一个从下午 3 点开始到下午 5 点结束的事件)。我需要编写一个 SQL 查询来返回事件尚未结束的行。例如,如果我在 16:48 查询,会返回上面的事件,因为它还不是 17:00。如果有帮助,我只关心小时值,分钟可以忽略。

如果数据在适当的时间字段中,这将是微不足道的,但是当数据是文本时,我对如何做到这一点有点困惑。我假设我可以使用某种正则表达式来解析第二个小时的值,并可能将它与 CURRENT_TIME 结合起来进行某种比较,但我不确定如何将它们放在一起。

谁能帮我吗?

4

2 回答 2

1
SELECT *
FROM   tbl
WHERE  now()::time BETWEEN left(time_col, 5)::time
                   AND    right(time_col, 5)::time

这将返回表tbl当前本地时间 now()::time位于列中编码的开始和结束之间的所有行time_col——这意味着它们已经开始,但尚未结束。time_col这显然需要与您的问题中的模式完全匹配的格式良好的字符串。

left()right()已在 PostgreSQL 9.1 中引入。在旧版本中,您可以用substr()已经提供的 @lserni 等表达式替换。

于 2012-10-21T22:30:05.360 回答
0

您可以将文本与伪日期字段进行比较。您甚至可以查看分钟,因为它们仍然按字典顺序排列。

... WHERE SUBSTR(datefield, 7, 5) >= to_char(NOW(), 'HH24:MI');

或许

... WHERE split_part(datefield, '-', 2) >= to_char(NOW(), 'HH24:MI');

您还可以使用正则表达式进行检查,以防万一您得到“17:00 到 23:00”或其他内容:

... WHERE substring(datefield from '\d\d:\d\d$') >= to_char(NOW(), 'HH24:MI')
    AND   substring(datefield from '^\d\d:\d\d') <= to_char(NOW(), 'HH24:MI');

最后一次检查应该自动忽略格式错误的日期。

于 2012-10-21T21:52:30.173 回答