在PostgreSQL中,我有一个文本列,其中包含表示此格式的事件开始和停止时间的值:“15:00-17:00”(例如,这是一个从下午3点开始到下午5点结束的事件)。我需要编写一个SQL查询,返回事件尚未结束的行。例如,如果我在16:48查询,则会返回上面的事件,因为它还不是17:00。如果有帮助,我只关注小时值,可以忽略几分钟。
如果数据在适当的时间字段中,这将是微不足道的,但是当数据是文本时,我对如何做到这一点感到困惑。我假设我可以使用某种正则表达式来解析第二小时的值,并且可能将它与CURRENT_TIME结合起来进行某种比较,但我不确定如何将它们放在一起。
任何人都可以帮助我吗?
答案 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
中格式正确的字符串与您问题中的模式完全匹配。
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');
最后一次检查应该会自动忽略格式错误的日期。