可变日期取决于时间

时间:2013-10-17 13:53:02

标签: oracle time case

我有一个问题。我有一个查询将作为夜间工作的一部分运行。此查询应该为我提供当天发生的所有操作。然而,这是棘手的部分,它不会总是在同一时间运行。

因为它是夜间工作的一部分,所以可能发生在第1天,查询在00:05运行,在第2天,它在23:55运行。这使查询变得复杂,因为我不能说使用今天的日期或使用昨天的日期。

到目前为止,我得到了以下查询:

select deuda_id from deuda where n_expediente in 
   (select 
      (case when to_char(sysdate, 'HH24:MI:SS') between '00:00:00' and '12:00:00' then 
           (select n_expediente from cartas_enviadas where codigo_carta in ('OIEUR','OIGBP') and f_envio > trunc(sysdate-1)
           ) else 
           (select n_expediente from cartas_enviar where codigo_carta in ('OIEUR','OIGBP')
           )
       ) from dual
   );

一点解释:(数据库是西班牙语/意大利语): deuda_id是唯一的发票号。 n_expediente是案例编号(对于此客户端始终是唯一的)。 f_envio是执行日期。 codigo_carta是动作类型。

Cartas_enviar保留所有到期的行动。执行操作时,将输入f_envio。一夜之间,所有已执行的操作都将从cartas_enviar移至cartas_enviadas。)

Wat我想做的是以下内容:

我想看看当前的时间。如果是在午夜之前,我想查看表cartas_enviar,并从那里获取n_expediente,但前提是该操作是OIEUR或OIGBP。如果它是在午夜之后,我想查看表cartas_enviadas,并从那里获取n_expediente,但前提是该操作是OIEUR或OIGBP,并且该操作是否已于昨天执行。

但是,当我尝试执行此查询时,我收到以下错误消息: ORA-00905: missing keyword

有人可以帮我解决一下这个问题吗?

PS:这是一个Oracle数据库

1 个答案:

答案 0 :(得分:0)

问题是你不能从子查询的子查询中提取许多这样的值来传回它们。请尝试这种方法:

select deuda_id
  from deuda
where 
  (to_char(sysdate, 'HH24:MI:SS') between '00:00:00' and '12:00:00'
  AND n_expediente IN (select n_expediente
                        from cartas_enviadas
                      where codigo_carta in ('OIEUR','OIGBP')
                        and f_envio > trunc(sysdate-1) ))
  OR (NOT to_char(sysdate, 'HH24:MI:SS') between '00:00:00' and '12:00:00'
    AND n_expediente IN (select n_expediente
                          from cartas_enviar
                          where codigo_carta in ('OIEUR','OIGBP')))
;