eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › różnica dat C# vs PL/SQL
Ilość wypowiedzi w tym wątku: 8

  • 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

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: