|
|
Strona 1 z 1
|
[ Posty: 14 ] |
|
Autor |
Wiadomość |
novice_man
Rejestracja: 2008-08-22, 23:16 Posty: 3
|
Data dualna dual_poc
Witam,
poszukuję informacji jak skonwertować datę dualną w bazie w wersji Btrieve z tabeli WARTOSCI_KADR ( http://www.mix-soft.pl/wiedza/opiskd200 ... TOSCI_KADR)
Z góry dzięki za pomoc!
|
2008-08-22, 23:19 |
|
|
Autor |
Wiadomość |
Mix-soft.pl
|
|
|
rafal
Ekspert
Rejestracja: 2007-11-16, 15:08 Posty: 4000 Pomógł: 448
|
róźnica pomiędzy "9999-12-31" a datą zawartą w polu dual_poc to właśnie data której szukasz.
|
2008-08-23, 18:10 |
|
|
novice_man
Rejestracja: 2008-08-22, 23:16 Posty: 3
|
A czy mógłbym prosić o jakiś przykład konwersji w sqlu accessowym bądź tsqlu ?
Obecnie walczę w taki sposób:
select dateadd(day,-(select datediff(day,'5000/01/01','7992/3/1')),'5000/01/01')
Metoda ta działa dla niektórych dat ale dla większości nie, obawiam się że zaproponowana metoda różnicy z 9999-12-31 również nie będzie skuteczna w wielu przypadkach. Np
2005-11-02 = 7994-3-2, konwersja działa
2005-11-01 = 7994-3-3, konwersja działa
2006-01-01 = 7993-12-31 tu już nie. Wrzucenie 7993-12-31 do fcji powyżej daje 2006-01-02. W praktyce dla wielu dat występują różnice rzędu 1-3 dni...
Być może operację trzeba przeprowadzać na poszczególnych paczkach bajtów utrzymujących kolejne fragmenty daty, ale nie mam pojęcia jak...
|
2008-08-23, 19:04 |
|
|
rafal
Ekspert
Rejestracja: 2007-11-16, 15:08 Posty: 4000 Pomógł: 448
|
nie ma takiej funkcji w SQL'u.
To nie jest zwykła różnica pomiędzy datami. czyli DATEDIFF nie tu się nie przyda.
Cytuj: 2006-01-01 = 7993-12-31 tu już nie.
Kod: 9999 - 7993 = 2006 13 - 12 = 01 32 - 31 = 01
Działania należy przeprowadzić pomiędzy poszczególnymi elementami (rrrr,mm,dd) a nie całymi datami i samodzielnie poskładać datę do kupy.
|
2008-08-24, 15:03 |
|
|
rafal
Ekspert
Rejestracja: 2007-11-16, 15:08 Posty: 4000 Pomógł: 448
|
Dodatkowo może zdarzyć się tak, że odczytując dane z Kadr i Płac za pomocą Pervasiva i ODBC wystąpi błąd w polu dual_poc.
O ile BTRIEVE nie sprawa poprawności daty w tym polu o tyle Pervasive sprawdza i nie odczyta błędnej wartości.
|
2008-08-24, 15:07 |
|
|
novice_man
Rejestracja: 2008-08-22, 23:16 Posty: 3
|
Kod: 9999 - 7993 = 2006 13 - 12 = 01 32 - 31 = 01
Stosując takie podejście, wówczas nie skonwertuję poprawnie dat
7994-3-2, 7994-3-3 otrzymując odpowiednio 2005-10-30 oraz 2005-10-29 a jest to prezentowne w systemie jako 2005-11-02 i 2005-11-01.
Zatem jeśli dobrze zrozumiałem, metoda jest poprawna tyle tylko daty odczytywane przz pervasive'a są niepoprawne ?
Może wobec tego mógłbym prosić o radę czym powinienem je odczytać aby móc poprawnie wyeksportować do innych baz ? Dysponuję plikami DAT i DDF.
|
2008-08-24, 15:30 |
|
|
rafal
Ekspert
Rejestracja: 2007-11-16, 15:08 Posty: 4000 Pomógł: 448
|
możez jeszcze zmienić w tabelach systemowych typ pola dual_poc z 3 na 1, spowoduje to wyświetlanie daty w formie liczby int.
nie wiem w czym Ci będzie to pomocne. Napewno nie wywali się Pervasive jak spotka w tym polu "głupią" datę o której pisałem wczesniej.
|
2008-08-25, 22:24 |
|
|
darek.007
Rejestracja: 2007-12-13, 23:19 Posty: 367 Pomógł: 2
|
a może po prostu tak.....
Kod: string sub dat(long sP) long s(5) s(1) = sP&0xffff0000 s(2) = s(1) / 65536
s(1) = sP&0x0000ff00 s(3) = s(1) / 256
s(1) = sP&0x000000ff s(4) = s(1)
dat = using "%4.4d-%2.2d-%2.2d",s(2),s(3),s(4)
endsub
Ostatnio zmieniony 2008-09-02, 12:29 przez darek.007, łącznie zmieniany 1 raz
|
2008-09-02, 09:49 |
|
|
barnie
Ekspert
Rejestracja: 2008-04-07, 13:26 Posty: 208 Pomógł: 2
|
rafal pisze: możez jeszcze zmienić w tabelach systemowych typ pola dual_poc z 3 na 1, spowoduje to wyświetlanie daty w formie liczby int.
nie wiem w czym Ci będzie to pomocne. Napewno nie wywali się Pervasive jak spotka w tym polu "głupią" datę o której pisałem wczesniej. darek.007 pisze: a może po prostu tak..... Kod: string sub dat(long sP) long s(5) s(1) = sP&0xffff0000 s(2) = s(1) / 65536
s(1) = sP&0x0000ff00 s(3) = s(1) / 256
s(1) = sP&0x000000ff s(4) = s(1)
dat = using "%4.4d-%2.2d-%2.2d",s(2),s(3),s(4)
endsub łącząc te dwie rzeczy otrzymujemy : Kod: select CAST( CAST(CAST((9999-(dual_poc&(-65536))/65536) as INTEGER) as varchar(4))+'-'+ CAST(CAST((13-(dual_poc & 65280)/256) as INTEGER) as varchar(2))+'-'+ CAST(CAST((31-(dual_poc&255)) as INTEGER) as varchar(2)) as DATE) from "WARTOSCI_KADR"
|
2008-09-02, 21:50 |
|
|
rafal
Ekspert
Rejestracja: 2007-11-16, 15:08 Posty: 4000 Pomógł: 448
|
Kod: date d d.FromStr("7994-3-2") print d.DecodeDual()
|
2009-05-28, 15:41 |
|
|
mtabor
Rejestracja: 2014-06-23, 12:25 Posty: 3
|
Re: Data dualna dual_poc
Witam, Mam podobny problem w symfoni KDP 2014 gdzie w bazie pervasive w tabeli "INS_SCH_CZAS" występuje kolumna dual_poc. Aby otrzymać dual_poc należy dokonać odejmowania np. :
9999 - 2014 = 7985 13 - 7 = 6 32 - 10 = 22
Ale co zrobić jeśli posiadamy datę 2014-7-1
9999 - 2014 = 7985 13 - 7 = 6 32 - 1 = 31
Niestety pervasive nie przyjmie daty 7985-6-31 ponieważ czerwiec ma tylko 30 dni.
|
2014-09-03, 09:44 |
|
|
rafal
Ekspert
Rejestracja: 2007-11-16, 15:08 Posty: 4000 Pomógł: 448
|
Re: Data dualna dual_poc
Czy chcesz zapisać Pervasivem datę do bazy czy tylko odczytać?
Bo jak to drugie to co ma Ci nie przyjać?
|
2014-09-03, 09:49 |
|
|
mtabor
Rejestracja: 2014-06-23, 12:25 Posty: 3
|
Re: Data dualna dual_poc
Potrzebuję dodać ręcznie wartość dual_poc dla daty 2014-07-01. Pervasive przy próbie dodania takiej wartości do bazy rzuca błąd :
<<<<<<<<<<<<<<<<<<<<<<<< [LNA][Pervasive][ODBC Engine Interface]'7985-06-31' is an invalid date value. If using '0000-00-00', replace it with NULL for a constant, or IS NULL in expressions. >>>>>>>>>>>>>>>>>>>>>>>>
|
2014-09-03, 10:57 |
|
|
GROSZ-ek
Rejestracja: 2015-01-25, 20:22 Posty: 1
|
Re: Data dualna dual_poc
Aby uzyskać datę dualną za pomocą Pervasive: 1. Należy zmienić deklarację typy pola z date na integer. Używamy do tego ustawień w tabelach systemowych danej bazy (przykład dla KDP 2015a - dla wcześniejszych wersji Symfonii nazwa pola jest 'dual_poc'). Zmiana jest bezpieczna, nie ingeruje w dane firmy, a do jej odwrócenia wystarczy jeszcze raz wygenerować ddf-y. Kod: update X$Field set Xe$DataType = 1 where Xe$Name = 'begin_date_dual'
Należy wyjść i jeszcze raz wejść do PCC - zamiast daty w tym polu powinna być widoczna bardzo duża liczba. 2. Taką liczbę można już skonwertować na datę według schematów podanych powyżej, ale ja bardziej wolę korzystać z funkcji 'dateadd', dzięki czemu mam pewność, że kwerenda zawsze się wykona: Kod: select begin_date_dual ,cast(dateadd(day,CAST(32-(begin_date_dual&255) as INTEGER)-1, dateadd(month,CAST(13-(begin_date_dual & 65280)/256 as INTEGER)-1, dateadd(year,CAST(9999-(begin_date_dual&(-65536))/65536 as INTEGER)-1, '0001-1-1'))) as date) from "HRV_ROWS"
Voil'a, działa! Kod: begin_date_dual EXPR_1 523370783 12/1/2013
|
2015-01-25, 20:50 |
|
|
|
Strona 1 z 1
|
[ Posty: 14 ] |
|
Kto jest online |
Użytkownicy przeglądający to forum: Nie ma żadnego zarejestrowanego użytkownika i 10 gości |
|
Nie możesz tworzyć nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz dodawać załączników
|
|
|
|