在postgresql中,当结束时间有时超过午夜时,如何计算两次之间的持续时间

在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

我必须根据开始时间和结束时间计算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       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小时的活动。然后您的查询将返回错误的答案。感谢您解释我想要的:-)并感谢您的回答。它工作得很好。