在午夜至凌晨6点之间减去日期的一天-Oracle

时间:2020-08-12 19:50:38

标签: sql oracle datetime case where-clause

我正在尝试做一个CASE WHEN语句,其中将日期更改为午夜之后和上午6点之前的时间戳的一天。我公司的工作时间为上午6点至凌晨6点,因此我想将午夜至凌晨6点之间发生的任何事情汇总为前一天的实例。每当尝试运行此命令时,都会出现以下错误,但我不知道如何解决它。我尝试过取消INTERVAL部分,TRUNC日期,但我想不出什么。

ORA-30081: invalid data type for datetime/interval arithmetic
30081. 00000 -  "invalid data type for datetime/interval arithmetic"
*Cause:    The data types of the operands are not valid for datetime/interval
           arithmetic.
*Action:
Error at Line: 2 Column: 104

查询:

SELECT 
CASE WHEN TO_CHAR(ADJUSTMENTTIME, 'HH24') BETWEEN 00 AND 06 THEN TO_CHAR(ADJUSTMENTTIME, 'YYYY-MM-DD') - INTERVAL '1' DAY
  ELSE TO_CHAR(ADJUSTMENTTIME, 'YYYY-MM-DD')
  END AS ADJ_DATE, 
CASE WHEN TO_CHAR(ADJUSTMENTTIME, 'HH24') BETWEEN 06 AND 17 THEN ' DAYS' 
  ELSE ' NIGHTS'
  END AS ADJUSTMENTHOUR, SUM(ADJUSTEDAMOUNT) AS ADJ_QTY
From
*DATASOURCE*
WHERE
DESTINATIONSTATUS = 'RIP' AND
ADJUSTMENTTIME BETWEEN '05-Aug-20 06.00.00.000000000 AM' AND '06-Aug-20 06.00.00.000000000 AM'
GROUP BY ADJUSTMENTTIME

1 个答案:

答案 0 :(得分:1)

从日期之前减去6小时较为简单:

select 
    to_char(adjustmenttime - interval '6' hour, 'yyyy-mm-dd') as adj_date,
    case when to_char(adjustmenttime, 'hh24') between '06' and '17'
        then 'days'
        else 'nights'
    end as adj_hour,
    sum(adjustmentamount) adj_amount
from datasource
where 
    destinationstatus = 'RIP'
    and adjustmenttime >= timestamp '2020-08-05 06:00:00'
    and adjustmenttime < timestamp '2020-08-06 06:00:00'
group by 1, 2