在postgresql中,当结束时间有时超过午夜时,如何计算两次之间的持续时间
我必须根据开始时间和结束时间计算postgres中事件的持续时间,两者都是HH:MM:SS格式。只需结束时间-开始时间有效:在postgresql中,当结束时间有时超过午夜时,如何计算两次之间的持续时间,sql,postgresql,date,intervals,Sql,Postgresql,Date,Intervals,我必须根据开始时间和结束时间计算postgres中事件的持续时间,两者都是HH:MM:SS格式。只需结束时间-开始时间有效: create table test_date as select sum(eindtijd - starttijd) as tijdsduur from evenementen_2019; 这将产生HH:MM:SS格式的间隔。但有时结束时间是第二天。示例: start_time end_time duration computed 18:00
create table test_date as
select sum(eindtijd - starttijd) as tijdsduur
from evenementen_2019;
这将产生HH:MM:SS格式的间隔。但有时结束时间是第二天。示例:
start_time end_time duration computed
18:00 21:00 3:00 3:00
18:00 0:00 6:00 -18:00
18:00 1:00 7:00 -17:00
我只有没有时区的时间,没有日期
解决方案在概念上很简单:当持续时间<0时,加上24小时。所以我试着:
update test_date
set duration = to_date('24:00:00', 'HHMMSS') - duration
where duration < 0 * interval '1' second;
更新测试日期
设置持续时间=截止日期('24:00:00','HHMMSS')-持续时间
其中,持续时间<0*间隔“1”秒;
这将生成一个错误:
错误:“duration”列的类型为interval,但表达式的类型为timestamp,不带时区
没错,我认为timestamp-interval
会产生一个时间戳。我不知道如何解决这个问题。有人知道解决这个问题的最好方法是什么吗
我认为时间戳间隔会产生时间戳
是的。然后尝试将生成的时间戳存储到interval类型的列中,但这不起作用
请注意,如果它在本部分中幸存下来,它仍然无法工作,因为您的to_date
函数调用将在运行时失败
你说你应该加上24小时,但你想做的是从24小时中减去24小时(类型错误),如果24小时起作用的话,这是错误的
您可以将您所说的您想做的事情逐字逐句地翻译成SQL:
update test_date
set duration = duration + interval '24 hours'
where duration < 0 * interval '1' second;
更新测试日期
设置持续时间=持续时间+间隔“24小时”
其中,持续时间<0*间隔“1”秒;
“我必须计算事件的持续时间…”但您没有存储事件的日期。日期通常与事件的持续时间有关。(想想夏令时。)存储日期。@Mike Sherrill,你当然是对的,但这些是我得到的数据。然后是时候回击提供数据的人了。最终,他们可能会接受超过24小时的活动。然后您的查询将返回错误的答案。感谢您解释我想要的:-)并感谢您的回答。它工作得很好。