-
1. Data: 2009-10-25 23:20:17
Temat: różnica dat C# vs PL/SQL
Od: Jakub Owczarski <j...@g...com>
Witam.
Mam pewną bazę gdzie data trzymana jest w polu number. Po szybkim
sprawdzeniu (w oracle) wyszło mi, że jest to liczba dni od 0001-01-02.
Teraz potrzebowałem też pomieszać w tym na poziomie C# no i okazuje
się, że dostaję różne wyniki.
Testuję w oracle:
select to_date('2009-10-25','yyyy-mm-dd') - to_date('0001-01-02','yyyy-
mm-dd') ts from dual
dostaję ts = 733705
w C#:
TimeSpan ts = new TimeSpan();
ts = new DateTime(2009, 10, 25).Date - new DateTime(1, 1, 2).Date;
dostaję ts = 733703
Czyli dwa dni różnicy. Ma ktoś pomysł o co tu chodzi? Skąd się biora
te dwa dni różnicy?
Pozdrawiam.
-
2. Data: 2009-10-26 15:40:35
Temat: Re: różnica dat C# vs PL/SQL
Od: Mateusz Ludwin <n...@s...org>
Jakub Owczarski wrote:
> Czyli dwa dni różnicy. Ma ktoś pomysł o co tu chodzi? Skąd się biora
> te dwa dni różnicy?
Od urodzin Jezusa mieliśmy parę reform kalendarza :>
--
Mateusz Ludwin mateuszl [at] gmail [dot] com
-
3. Data: 2009-10-26 16:28:26
Temat: Re: różnica dat C# vs PL/SQL
Od: "Wiktor S." <wswiktor&poczta,fm@no.spam>
> w C#:
> TimeSpan ts = new TimeSpan();
> ts = new DateTime(2009, 10, 25).Date - new DateTime(1, 1, 2).Date;
> dostaję ts = 733703
> Czyli dwa dni różnicy. Ma ktoś pomysł o co tu chodzi? Skąd się biora
> te dwa dni różnicy?
Pewnie z błędu w jednym albo w drugim, ale nikt się nie spodziewa po
nieastronomicznym oprogramowaniu prawidłowej obsługi kosmicznych dat.
Weź sobie te dwa dni poprawki i zobacz, czy różnica się nie rozjeżdża w
zakresie powiedzmy lat 1900..2100.
--
Azarien
-
4. Data: 2009-10-27 08:52:50
Temat: Re: różnica dat C# vs PL/SQL
Od: Paweł Kierski <n...@p...net>
Jakub Owczarski wrote:
> Witam.
> Mam pewną bazę gdzie data trzymana jest w polu number. Po szybkim
> sprawdzeniu (w oracle) wyszło mi, że jest to liczba dni od 0001-01-02.
> Teraz potrzebowałem też pomieszać w tym na poziomie C# no i okazuje
> się, że dostaję różne wyniki.
> Testuję w oracle:
> select to_date('2009-10-25','yyyy-mm-dd') - to_date('0001-01-02','yyyy-
> mm-dd') ts from dual
> dostaję ts = 733705
>
> w C#:
> TimeSpan ts = new TimeSpan();
> ts = new DateTime(2009, 10, 25).Date - new DateTime(1, 1, 2).Date;
> dostaję ts = 733703
>
> Czyli dwa dni różnicy. Ma ktoś pomysł o co tu chodzi? Skąd się biora
> te dwa dni różnicy?
Bo to niejawnie wartości z po za zakresu. Jeśli nie znormalizujesz dat
np. do dni juliańskich, to nic z tego nie będzie. Równie dobrze możesz
porównywć daty z kalendarza Majów i prawosławnego.
Po drodze było co najmniej przejście z kalendarza juliańskiego na
gregoriański, które "zniknęło" kilka dni. Na dodatek ekstrapolując
wstecz regułę wyznaczania dni przestępnych z kalendarza gregoriańskiego
przed reformę masz dodatkowe kilka dni różnicy (np. juliański 1200 był
przestępny, choć wg reguły gregoriańskiej nie byłby).
--
Paweł Kierski
n...@p...net
-
5. Data: 2009-10-27 12:53:37
Temat: Re: różnica dat C# vs PL/SQL
Od: "Wiktor S." <wswiktor&poczta,fm@no.spam>
> Po drodze było co najmniej przejście z kalendarza juliańskiego na
> gregoriański,
Które "nie wiadomo kiedy było", bo następowało w różnych krajach różnie w
okresie 1582-1926. Jakiekolwiek daty w tym okresie muszą brać pod uwagę
państwo.
> które "zniknęło" kilka dni.
Dlatego nie wolno zakładać, że jakikolwiek system do współczesnego użytku
(jak baza danych) będzie prawidłowo operować na historycznych datach. Jak
potrzebne są takie daty, to się robi własną obsługę kalendarza, i trzeba się
niestety zagłębiać we wszystkie niuanse..
> Na dodatek ekstrapolując
> wstecz regułę wyznaczania dni przestępnych z kalendarza
> gregoriańskiego przed reformę masz dodatkowe kilka dni różnicy (np.
> juliański 1200 był przestępny, choć wg reguły gregoriańskiej nie
> byłby).
No jeżeli bierzemy pod uwagę przesunięcie daty, to jednocześnie należy
zmienić regułę lat przestępnych. Dochodzi jeszcze fakt, że Rzymianie trochę
dowolnie podchodzili sobie do lat przestępnych, więc liczenie dat w roku 1 z
dokładnością co do dnia traci sens: dokładna rachuba została utracona.
--
Azarien
-
6. Data: 2009-10-27 17:11:28
Temat: Re: różnica dat C# vs PL/SQL
Od: Jakub Owczarski <j...@g...com>
On Oct 27, 12:53 pm, "Wiktor S." <wswiktor&poczta,f...@no.spam> wrote:
> Dlatego nie wolno zakładać, że jakikolwiek system do współczesnego użytku
> (jak baza danych) będzie prawidłowo operować na historycznych datach. Jak
> potrzebne są takie daty, to się robi własną obsługę kalendarza, i trzeba się
> niestety zagłębiać we wszystkie niuanse..
Tylko, że to jest baza która już istnieje, daty są w niej
przechowywane jako number.
Nie ma możliwości zapytać twórców jak oni to liczyli.
"Organoleptycznie" stwierdziłem, że jest to liczba dni od
"0001-01-02".
Jak myślicie czy jest jakaś gwarancja, że oracle w każdym następnym
wydaniu zachowa ten sposób liczenia który ma teraz?
Najlepiej by było oczywiście dowiedzieć się jak to liczyli ci którzy
bazę tworzyli ale niestety jest to niemożlwe.
Pzdr.
-
7. Data: 2009-10-27 19:43:05
Temat: Re: różnica dat C# vs PL/SQL
Od: "Wiktor S." <wswiktor&poczta,fm@no.spam>
> Tylko, że to jest baza która już istnieje, daty są w niej
> przechowywane jako number.
> Nie ma możliwości zapytać twórców jak oni to liczyli.
> "Organoleptycznie" stwierdziłem, że jest to liczba dni od
> "0001-01-02".
Bo "tak ci wyszło", ale z tego co widzisz - nie możesz tak odległym datom
ufać.
> Jak myślicie czy jest jakaś gwarancja, że oracle w każdym następnym
> wydaniu zachowa ten sposób liczenia który ma teraz?
Oracle nie ma tu nic do rzeczy - bo do przechowywania daty ma typ DATETIME
(czy jak tam), a jeśli w bazie data jest jako liczba - to jest to podejście
niestandardowe i prawdopodobnie widzimisię twórcy bazy.
Ale:
przeczytaj sobie http://en.wikipedia.org/wiki/Julian_day
i spójrz na tabelkę: wartości w okolicach 733707 to system "Rata Die", i z
definicji liczy się to jako RD = floor(JD - 1721424.5), gdzie wzór na JD
podany jest niżej na tej samej stronie.
Jeśli nie chcesz takiego błędu o dzień czy dwa, licz dokładnie według wzorów
(jako godzinę przyjmij sobie południe albo godzinę z bazy, jeśli jest).
--
Azarien
-
8. Data: 2009-10-28 08:31:56
Temat: Re: różnica dat C# vs PL/SQL
Od: Jakub Owczarski <j...@g...com>
On Oct 27, 7:43 pm, "Wiktor S." <wswiktor&poczta,f...@no.spam> wrote:
> Oracle nie ma tu nic do rzeczy - bo do przechowywania daty ma typ DATETIME
> (czy jak tam), a jeśli w bazie data jest jako liczba - to jest to podejście
> niestandardowe i prawdopodobnie widzimisię twórcy bazy.
No jednak ma, mógł by teoretycznie np. w kolejnym wydaniu stwierdzić,
że teraz będzie liczyć inaczej(np tak jak wspomniany python czy C#).
No ale to nie ważne bo
> przeczytaj sobiehttp://en.wikipedia.org/wiki/Julian_day
przeczytałem i to chyba faktycznie to jest Rata Die, a tylko
przypadkiem wyszło mi, że data - 0001-01-02.
Dzięki!
Teraz wygląda to tak:
SELECT FLOOR( ( TO_CHAR (SYSDATE, 'j')
+ ( (TO_CHAR (SYSDATE, 'hh24') - 12) / 24)
+ (TO_CHAR (SYSDATE, 'mi') / 1440)
+ (TO_CHAR (SYSDATE, 'ss') / 86400))
- 1721424.5)
RD
FROM DUAL
Dzięki, pozdrawiam