ORACLE ФИЛЬТР ДАТЫ НЕ ПОКАЗЫВАЕТ ПРАВИЛЬНЫЙ РЕЗУЛЬТАТ ДАТЫ - PullRequest
1 голос
/ 13 июля 2020

У меня есть данные как

ID      MYDATE
1       2020-02-02 19:45:00:00
1       2020-02-02 20:00:00:00

Мне нужно получить данные только min_date.

Итак, я использовал запрос как (учитывая восточный и c часовой пояс)

 SELECT  ID, MYDATE 
    FROM MYTABLE
     WHERE TO_CHAR(FROM_TZ(TO_TIMESTAMP(TO_CHAR(MYDATE.'YYYY-MM-DD HH24.MI.SS'),'YYYY- 
   MM-DD HH24.MI.SS), 'AMERICA/NEW_YORK) AT TIME ZONE 'UTC', 'YYYYMMDD') = 
    '20200202'

Я получаю результат на 02.02.2020 (что ожидалось)

1   2020-02-02 19:45:00:00

Но когда я бегу на дату «20200203», я получаю

 1      2020-02-02 20:00:00:00

чего я не должен получать (я не должен получать никаких результатов)

Помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Часовой пояс AMERICA / NEW_YORK - UT C -4, поэтому, когда вы конвертируете AMERICA / NEW_YORK в UT C, вы получаете исходное время + 4 часа, ie 2020-02-03 01:00:00 UTC:

WITH t (id, mydate) 
AS
(
  SELECT 1, TO_DATE('2020-02-02 19:45:00','YYYY-MM-DD HH24:MI:SS') FROM DUAL union
  SELECT 2, TO_DATE('2020-02-02 20:00:00','YYYY-MM-DD HH24:MI:SS') FROM DUAL  
)
select
  TO_CHAR(MYDATE,'YYYY-MM-DD HH24.MI.SS') original_time,
  FROM_TZ(
     TO_TIMESTAMP(
        TO_CHAR(MYDATE,'YYYY-MM-DD HH24.MI.SS')
       ,'YYYY-MM-DD HH24.MI.SS'
     ),
     'AMERICA/NEW_YORK'
   )
   AT TIME ZONE 'UTC'
    as UTC_TIME
from t;

ORIGINAL_TIME       UTC_TIME
------------------- --------------------------------------
2020-02-02 19.45.00 2020-02-03 00:45:00.000000000 UTC
2020-02-02 20.00.00 2020-02-03 01:00:00.000000000 UTC

2 rows selected.

А to_timestamp(to_char(... в этом случае не нужно, проще использовать CAST:

FROM_TZ(cast(MYDATE as timestamp),'AMERICA/NEW_YORK') AT TIME ZONE 'UTC'
0 голосов
/ 13 июля 2020

С двумя строками выборочных данных ... сложно дать решение, которое вы ищете. Но вот запрос, который дает вам строку с самой низкой датой для идентификатора:

WITH tab (id, mydate) 
AS
(
  SELECT 1, TO_DATE('2020-02-02 19:45:00','YYYY-MM-DD HH24:MI:SS') FROM DUAL union
  SELECT 1, TO_DATE('2020-02-02 20:00:00','YYYY-MM-DD HH24:MI:SS') FROM DUAL  
),
ordered_dates AS
(
SELECT 
       id, 
       mydate, 
       ROW_NUMBER() OVER (PARTITION BY id ORDER BY mydate) AS rn FROM tab
)
SELECT id, TO_CHAR(mydate,'YYYY-MM-DD HH24:MI:SS') FROM ordered_dates WHERE rn = 1;

...