Февр. 222008
 

Според документацията, типът данни DATE в Oracle поддържа дати от 01.01.4712 пр. Хр. до 31.12.9999. Това за 9999 година изглежда логично – гарантира, че годините ще бъдат събрани в 4 цифри (има да си блъскат главата на 01.01.10000…). Интересно, обаче, кой е предложил годината, избрана за долна граница – 4712 пр. Хр. и защо точно нея.

Човекът, предложил да се използва тази година за начало на епохата се казва Joseph Justus Scaliger. През далечната 1583 година, по време на Григорианската календарна реформа, Joseph Scaliger изчислил кога за последно са имали общо начало трите циклъла, използвани в юлиянският календар. Оказало се,че това е било на 01.01.4713 г. пр. Хр. Тъй като това се пада далече преди всички интересни за науката през 16 век събития, Joseph Scaliger решил датите са се броят точно от този ден, като се записва броят дни след него. Такова съвпадение се пада веднъж на 7980 години (повече – тук). Tова е най-старото влияние върху типа DATE в Oracle.

А защо в Oracle се ползва 4712 г. пр. Хр., а не 4713? Въпрос на начин на изчисление. Проблема е, че в календара няма година 0:

sql> alter session set nls_date_format='DD.MM.YYYY BC';
alter session set succeeded.

sql> select to_date('01.01.0001 AD') my_date from dual;
MY_DATE
-------------------------
01.01.0001 AD

sql> select to_date('01.01.0001 AD') - 1 my_date from dual;
MY_DATE
-------------------------
31.12.0001 BC

Това показва, че денят преди 01.01.0001 AD е точно 31.12.0001 BC. От друга страна, между двете дати има не 1, а 367 дни:

sql> select to_date('01.01.0001 AD')- to_date('31.12.0001 BC') num_days from dual
NUM_DAYS
----------------------
367

Този бъг води до грешка от точно една година при изчисляването на юлиянските дни.

 Posted by at 14:42

Sorry, the comment form is closed at this time.