mojaSymfonia FORUM https://forum.mix-soft.pl/ |
|
Data dualna dual_poc https://forum.mix-soft.pl/viewtopic.php?f=15&t=252 |
Strona 1 z 1 |
Autor: | novice_man [ 2008-08-22, 23:19 ] |
Tytuł: | 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! |
Autor: | rafal [ 2008-08-23, 18:10 ] |
Tytuł: | |
róźnica pomiędzy "9999-12-31" a datą zawartą w polu dual_poc to właśnie data której szukasz. |
Autor: | novice_man [ 2008-08-23, 19:04 ] |
Tytuł: | |
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... |
Autor: | rafal [ 2008-08-24, 15:03 ] |
Tytuł: | |
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. |
Autor: | rafal [ 2008-08-24, 15:07 ] |
Tytuł: | |
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. |
Autor: | novice_man [ 2008-08-24, 15:30 ] |
Tytuł: | |
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. |
Autor: | rafal [ 2008-08-25, 22:24 ] |
Tytuł: | |
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. |
Autor: | darek.007 [ 2008-09-02, 09:49 ] |
Tytuł: | |
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 |
Autor: | barnie [ 2008-09-02, 21:50 ] |
Tytuł: | |
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" |
Autor: | rafal [ 2009-05-28, 15:41 ] |
Tytuł: | |
Kod: date d d.FromStr("7994-3-2") print d.DecodeDual() |
Autor: | mtabor [ 2014-09-03, 09:44 ] |
Tytuł: | 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. |
Autor: | rafal [ 2014-09-03, 09:49 ] |
Tytuł: | 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ć? |
Autor: | mtabor [ 2014-09-03, 10:57 ] |
Tytuł: | 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. >>>>>>>>>>>>>>>>>>>>>>>> |
Autor: | GROSZ-ek [ 2015-01-25, 20:50 ] |
Tytuł: | 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 |
Strona 1 z 1 | Strefa czasowa UTC+1godz. [letni] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |