Я застрял.
Oracle показывает странное поведение при обработке меток времени, позвольте мне объяснить:
У меня есть простая таблица с первичным ключом и индексом. AUDIT_FROM_TS
является частью первичного ключа. Он разделен с использованием AUDIT_FROM_TS
с месячным интервалом.
Соответствующий DDL
CREATE TABLE "SDR"."TRADE_DEAL_F"(
...
"AUDIT_FROM_TS" TIMESTAMP (9) DEFAULT SYS_EXTRACT_UTC(SYSTIMESTAMP) NOT NULL ENABLE,
...
CONSTRAINT "PK_TRADE_DEAL" PRIMARY KEY ("TRADE_DEAL_ID", "VALID_FROM_DT", "AUDIT_FROM_TS")
...
PARTITION BY RANGE ("AUDIT_FROM_TS") INTERVAL (NUMTOYMINTERVAL(1,'MONTH'))
...
При выполнении этого запроса:
select count(*) from trade_deal_f where AUDIT_FROM_TS < timestamp '9999-12-31 00:00:00';
я получил
ORA-01841: (полный) год должен быть между -4713 и +9999, а не 0 01841. 00000 - "(полный) год должен быть между -4713 и +9999, а не 0" * Причина: введен неверный год *Действие: введите год в указанном диапазоне
Но этот работает нормально:
select count(*) from trade_deal_f where AUDIT_FROM_TS < timestamp '9999-12-15 00:00:00';
Я сделал небольшую отладку, и если увеличить дату до 16 декабря 9999 года, выдается та же ошибка.
Теперь больше отладки...
SELECT DBTIMEZONE from dual;
возвращает +00:00
SELECT SESSIONTIMEZONE FROM dual;
возвращает Europe/London
Может ли кто-нибудь помочь с этим, пожалуйста? Я не на 100% уверен, что это проблема часового пояса, так как это сместит дату на 2 недели...
select count(*) from trade_deal_f where AUDIT_FROM_TS = timestamp '9999-12-31 00:00:00 Europe/London';
select count(*) from trade_deal_f where AUDIT_FROM_TS = timestamp '9999-12-31 00:00:00 GMT';
select count(*) from trade_deal_f where AUDIT_FROM_TS = timestamp '9999-12-31 00:00:00 UTC';
select count(*) from trade_deal_f where AUDIT_FROM_TS = timestamp '9999-12-31 00:00:00 +00:00';
все это похоже на правду...
timestamp '9999-12-31 00:00:00 00:00
' - person dnoeth   schedule 29.07.2015