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/