Преобразование sysdate в BST (брити sh летнее время) - PullRequest
0 голосов
/ 28 мая 2020

У меня есть Java api, который получает данные из базы данных oracle, которая находится в часовом поясе ET. Я хочу запросить эту таблицу, используя sysdate по 2 столбцам, но sysdate следует выбрать как текущее значение даты BST, а не как значение даты ET.

select * from customers where sysdate between mem_registered_date and mem_deregistered_date;

Как это можно сделать? помогите пожалуйста

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

При запросе столбца со значением только даты, без какого-либо времени дня или часового пояса, то есть столбца типа, аналогичного типу SQL -стандарт DATE, тогда используйте Java класс LocalDate.

Как правило, лучше всего использовать полуоткрытое определение промежутка времени, где начало включено, а окончание - исключено. Это позволяет пролетам почти примыкать друг к другу без зазоров и перекрытий. Поэтому никогда не используйте команду SQL BETWEEN для диапазонов даты и времени, поскольку она полностью закрыта (начало и конец включены).

Получите сегодняшнюю дату, как показано на настенных часах, используемых людьми определенного региона (часовой пояс).

BST не является часовым поясом реального времени. Для Briti sh time используйте Europe/London.

ZoneId z = ZoneId.of( "Europe/London" ) ;
LocalDate today = LocalDate.now( z ) ;

SQL будет выглядеть примерно так:

SELECT * 
FROM event_ 
WHERE ? >= start_
AND ? < end_
;

Заполните заполнители.

myPreparedStatement.setObject( 1 , today ) ;
myPreparedStatement.setObject( 2 , today ) ;

Загрузить значения даты из базы данных в Java.

LocalDate start = myResultSet.getObject( … , LocalDate.class ) ;

TIMESTAMP WITHOUT TIME ZONE

Неправильно названный DATE в база данных Oracle фактически представляет дату с указанием времени даты без контекста часового пояса или смещения от UT C. Таким образом, этот тип не может представлять момент, конкретную c точку на временной шкале. Если значение - полдень 23 января следующего года, мы не можем знать, полдень ли это в Токио, Тулузе или Толедо - все это разные моменты с разницей в несколько часов. Этот тип DATE сродни стандартному типу SQL TIMESTAMP WITHOUT TIME ZONE.

Таким образом, для этого типа данных ваш вопрос о часовых поясах не имеет смысла. Яблоко и апельсины. Вовлечение часовых поясов означает, что вы отслеживаете моменты, указав c точек на временной шкале. Но Oracle DATE не может представлять моменты, как обсуждалось выше.

Чтобы отслеживать моменты, вы должны использовать столбец типа, подобного SQL -стандарту TIMESTAMP WITH TIME ZONE.

2 голосов
/ 28 мая 2020

Самый простой способ преобразования между часовыми поясами - использовать тип данных, который понимает часовые пояса, TIMESTAMP. Затем, когда вы перевели в нужный часовой пояс, затем CAST он вернулся к типу данных DATE:

SELECT *
FROM   customers
WHERE  CAST( SYSTIMESTAMP AT TIME ZONE 'Europe/London' AS DATE )
         BETWEEN mem_registered_date AND mem_deregistered_date;

Я предполагаю, что вам нужно текущее время в Соединенном Королевстве ( BST летом и GMT зимой), если вы хотите часовой пояс UTC + 1, используйте:

CAST( SYSTIMESTAMP AT TIME ZONE '+01:00' AS DATE )
...