Как сравнить дату со временем в оракуле - PullRequest
2 голосов
/ 23 октября 2019

Попытка сравнить две даты со временем. Но сравнение не работает.

SELECT *
   FROM attendance
  WHERE     TO_DATE (checktime, 'DD/MM/YYYY HH:MI:SS AM') >=
               TO_DATE ('01/09/2019 04:30:00 PM', 'DD/MM/YYYY HH:MI:SS AM')
        AND TO_DATE (checktime, 'DD/MM/YYYY HH:MI:SS AM') <=
               TO_DATE ('30/09/2019 10:00:00 PM', 'DD/MM/YYYY HH:MI:SS AM')
        AND userid = '3825'
        AND SUBSTR (checktime, -2, 2) = 'PM'
ORDER BY TO_DATE (checktime, 'DD/MM/YYYY HH:MI:SS AM') ASC

Я ожидал, что выходной сигнал будет равен или больше, чем 4:30 вечера, но меньше или равен 10:00 вечера. Но этоСравнение дат не работает. Вот вывод кода . Я хочу, чтобы мой результат включал дату и время между указанными периодами. Примечание. Тип данных CHECKTIME: varchar2.

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Я думаю, вам нужны данные за все дни (01/09/2019 - 30/09/2019), а время дня должно быть между 04:30 PM and 10: PM.

. Это можно сделать с помощью следующего запроса:

SELECT
    *
FROM
    ATTENDANCE
WHERE
    TRUNC(TO_DATE(CHECKTIME, 'DD/MM/YYYY HH:MI:SS AM'))
        BETWEEN TO_DATE('01/09/2019', 'DD/MM/YYYY') 
        AND TO_DATE('30/09/2019', 'DD/MM/YYYY')
    AND ( TO_DATE(CHECKTIME, 'DD/MM/YYYY HH:MI:SS AM') - TRUNC(TO_DATE(CHECKTIME, 'DD/MM/YYYY HH:MI:SS AM')) ) * 1440  -- converting difference into minutes
        BETWEEN 990 -- 04:30 PM in minutes (16.5*60)
        AND 1320 -- 10:00 PM in minutes (22*60)
    AND USERID = '3825'
    AND SUBSTR(CHECKTIME, - 2, 2) = 'PM'
ORDER BY
    TO_DATE(CHECKTIME, 'DD/MM/YYYY HH:MI:SS AM') ASC;

Ура !!

0 голосов
/ 23 октября 2019

Вы можете исправить свой формат, используя такой формат, содержащий TO_TIMESTAMP преобразование

SELECT *
  FROM attendance
 WHERE checktime 
       BETWEEN TO_TIMESTAMP('01/09/2019 16:30:00.000000','dd/mm/yyyy hh24:mi:ss.ff')
           AND TO_TIMESTAMP('30/09/2019 22:30:00.000000','dd/mm/yyyy hh24:mi:ss.ff')
   AND userid = 3825
 ORDER BY checktime;

Демо

РЕДАКТИРОВАТЬ: вам лучше добавить новый столбец с типом метки времени и обновить данные нового столбца, используя преобразование TO_TIMESTAMP, например ниже:

UPDATE attendance
   SET checktime2 = TO_TIMESTAMP('3/09/2019 5:38:36 PM','dd/mm/yyyy hh:mi:ss AM')  
 WHERE id = 3825
   AND checktime = '3/09/2019 5:38:36 PM' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...