将文本字段中的时间值与当前时间进行比较

时间:2012-10-21 20:32:46

标签: sql regex postgresql

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

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

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分: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中格式正确的字符串与您问题中的模式完全匹配。

PostgreSQL 9.1引入了

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

答案 1 :(得分: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');

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