проверка срока действия в запросе Oracle - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть таблица, которая содержит дату начала, ExpiryDate. Я хочу написать запрос oracle, который проверяет, больше ли дата истечения, чем текущая системная дата. Затем я хочу вернуть эту строку, иначе ноль будет результат запроса.

Я написал примерно так:

 select Name,Password,StartDate,ExpiryDate from db_name where UserName = 'abc' and status =1 and ExpiryDate >=(SELECT Round((sysdate - to_date('01-JAN-1970','DD-MON-YYYY')) * (86400))*1000 as dt FROM dual);

Вот описание таблицы:

 STARTDATE                 NOT NULL NUMBER(20)
 EXPIRYDATE                NOT NULL NUMBER(20)

Значения:

EXPIRYDATE
----------
1.5880E+12

после выполнения запроса, например select to_char (startdate), to_char (expirydate) Я получаю

TO_CHAR(STARTDATE)
----------------------------------------
TO_CHAR(EXPIRYDATE)
----------------------------------------
1587909960000
1587996480000

Но он работает нормально для всех случаев, но если дата истечения меньше (текущая) время + 6 часов) это дает ноль, кто-нибудь может сказать мне, как решить эту проблему?

Ответы [ 3 ]

1 голос
/ 27 апреля 2020

Unix время эпохи в часовом поясе UT C. Вы можете преобразовать текущее время в часовой пояс UT C и затем вычесть эпоху:

SELECT Name,
       Password,
       StartDate,
       ExpiryDate
FROM   IM_USER_MANAGEMENT
WHERE  UserName = 'abc'
AND    status =1
AND    ExpiryDate >= ( CAST( SYSTIMESTAMP AT TIME ZONE 'UTC' AS DATE )
                       - DATE '1970-01-01'
                     )*24*60*60*1000
0 голосов
/ 27 апреля 2020

Мне кажется, эти твои даты Javascript в стиле. То есть, похоже, что это времена с UNIX эпохи 1970-01-01 00:00:00 UTC, измеренные в миллисекундах. Обратите внимание, что они относятся к UT C, а не к вашему местному часовому поясу. Ваш часовой пояс Asia/Dhaka? Это на шесть часов больше UT C.

Мне также кажется, что ваши метки времени имеют десятисекундную точность. Показанные вами два делятся на 10 000.

Это формула для преобразования Javascript раз в Oracle UT C значения даты / времени

 SELECT TO_DATE('19700101','yyyymmdd') + (1587909960000/86400000) FROM DUAL;

Это дает SYSDATE - стиль рендеринга ваших значений в UT C время, а не местное время . Это дает 2020-04-26 14:06:00

Поскольку у вас есть явная ошибка в шесть часов, я думаю, ваш местный часовой пояс составляет Asia/Dhaka, UTC + 6. Но это также может быть America/Denver, UT C -6.

и ваше значение времени, пройденное по этой формуле, даст 2020-04-26 14:06:00. Что похоже на действительную недавнюю дату / время.

Это Угадай! Если вы работаете с деньгами других людей или проживаете в своей базе данных, спросите человека, который его запрограммировал. Это не родной для СУБД способ ведения дел, поэтому вам следует еще раз проверить.

Что происходит в формуле?

В Oracle, добавив 1.0 к значение стиля SYSDATE добавляет один календарный день к нему. Итак, мы начинаем с Oracle даты для UNIX эпохи TO_DATE('19700101','yyyymmdd').

Затем мы берем ваше значение метки времени в миллисекундах и преобразуем его в дни, деля на 86 400 000. Наконец, мы добавляем его к дата эпохи.

Вот несколько советов о том, как получить текущее время в UT C, чтобы вы могли сравнить его со своими отметками времени. Как получить значение UT C для SYSDATE на Oracle

0 голосов
/ 27 апреля 2020

Unix время эпохи, а? Посмотрите, поможет ли это.

Установите формат даты на что-то распознаваемое :

SQL> alter session set nls_date_format = 'dd.mm.yyyy hh24:mi:ss';

Session altered.

Пример данных:

SQL> select * From test;

             STARTDATE             EXPIRYDATE
---------------------- ----------------------
         1587909960000          1587996480000

Преобразовано в DATE значения:

SQL> select
  2    date '1970-01-01' + ( 1 / 24 / 60 / 60 / 1000) * startdate  startdt,
  3    date '1970-01-01' + ( 1 / 24 / 60 / 60 / 1000) * expirydate expdt
  4  from test;

STARTDT             EXPDT
------------------- -------------------
26.04.2020 14:06:00 27.04.2020 14:08:00

Или, используя его вместе с sysdate:

SQL> select *
  2  from test
  3  where sysdate between
  4    date '1970-01-01' + ( 1 / 24 / 60 / 60 / 1000) * startdate and
  5    date '1970-01-01' + ( 1 / 24 / 60 / 60 / 1000) * expirydate;

             STARTDATE             EXPIRYDATE
---------------------- ----------------------
         1587909960000          1587996480000

Как sysdate в настоящее время:

SQL> select sysdate from dual;

SYSDATE
-------------------
27.04.2020 12:45:56
...