Oracle - условие на дату и время - PullRequest
0 голосов
/ 26 октября 2018

Я работаю над этой базой данных, которая содержит информацию о заказах в магазинах на заводе. Я использую этот запрос, который получает данные заказа, используя дату закрытия в качестве условия. Он извлекает заказ, закрытый в течение двух недель.

select order.id, order.end_date, material.id, material.description
from plant.order inner join plant.material
on order.material = material.id
where order.end_date <= to_date('26/10/2018 06:00:00', 'DD/MM/YYYY HH24:MI:SS') 
where order.end_date <= to_date('12/10/2018 06:00:00', 'DD/MM/YYYY HH24:MI:SS') 

Поскольку рабочий день разделен на смены (например, рабочий день 26 октября начинается с 26/10 6:00 и заканчивается 27/10 6:00, чтобы охватить 24 часа), мне нужно управлять этим.

Можно ли использовать условие, которое проверяет, является ли час <6, и если условие истинно, оно записывает правильное значение в другой столбец? Или есть лучший способ управлять этим? </p>

order.id      order.end_date     material.id      material.description 
--------      --------------     -----------      --------------------
 1             26/10/2018 05:00    1                Lorem Ipsum
 2             26/10/2018 07:00    2                Lorem Ipsum


order.workday (new column)
-------------
 25/10/2018
 26/10/2018

В этом случае идентификатор заказа 1 должен быть результатом даты 25/10/2018, а идентификатор заказа 2 должен быть датой 26/10 / 2018.

Я надеюсь, что я был ясен.

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Попробуйте ниже, используя CASE WHEN

    select 
       order.id, 
       order.end_date, 
       material.id, 
       material.description,
       case when TO_CHAR (order.end_date, 'HH24:MI:SS')<'06:00:00' then order.end_date- interval '1' day else order.end_date end as workday
    from plant.order inner join plant.material,
    on order.material = material.id
    where order.end_date <= to_date('26/10/2018 06:00:00', 'DD/MM/YYYY HH24:MI:SS') 
    where order.end_date <= to_date('12/10/2018 06:00:00', 'DD/MM/YYYY HH24:MI:SS') 
0 голосов
/ 26 октября 2018

Вы можете просто использовать TRUNC(order.end_date - 6/24)

WITH t AS (
   SELECT TO_DATE('26/10/2018 05:00' , 'dd/mm/yyyy hh24:mi') AS end_date FROM dual
   UNION ALL SELECT TO_DATE('26/10/2018 07:00' , 'dd/mm/yyyy hh24:mi') AS end_date FROM dual)
SELECT end_date, TRUNC(end_date - 6/24)
from t;


+----------------------------------------+
|END_DATE           |TRUNC(END_DATE-6/24)|
+----------------------------------------+
|26.10.2018 05:00:00|25.10.2018          |
|26.10.2018 07:00:00|26.10.2018          |
+----------------------------------------+
...