Nekompatibilní Oracle DATE a .NET DateTime rubrika: Programování: .Net
Zdravím ve spolek,
dostal jsem se do menších problémů s datovým typem DATE v Oracle a jeho převodem do DateTime v .NET.
Situace je taková:
- pracujeme s databází, kde do pole DATE je v jiném systému ukládána časová složka typu "3 dny, 2 hodiny,... Prostě jak dlouho daná činnost trvá
- do datového pole je to, ale uloženo poněkud nečekaným způsobem, kdy se objevují hodnoty typu "-0001 01 01 BC 10:30 " prostě hodnoty před naším letopočtem
- změnu v jiném systému nemůžeme požadovat, takže se pokoušíme to nějak vyřešit
- jako DAL vrstvu používáme EntityFramework
Podle dokumentace zde https://docs.oracle.com/cd/B19306_01/win.102/b14307/featSafeType.htm#CJA...
to lze vyřešit pomocí mappingu v OracleDataAdaptéru. To ovšem není zcela vhodné řešení v rámci použití EF.
Dále jsem zkoušel použití nativního SQL a metody SqlQuery<> v rámci EF, kde jsem DATE sloupec převáděl pomocí TO_CHAR na běžný string. To je trochu lepší, ale přesto se mi to moc nelíbí.
Máte někdo s tímto problémem zkušenosti nebo nějaké nápady jak to vyřešit?
Díky.
Problém je v tom, že mají v roku 0, měsíci nebo dnu 0, což Oracle neumí. Zkus tohle:
select TO_DSINTERVAL(trunc(dt_date-to_date('01.01.0001','DD.MM.RRRR'))+365 || ' ' || to_char(add_months(dt_date,12), 'HH24:MI:SS')) from my_table
Vrací to Oracle typ INTERVAL DAY TO SECOND, který je přímo mapovatelný na .NET TimeSpan
Pro Tvoji hodnotu 10h 13m
Typ=12 Len=7: 100,100,1,1,11,14,1
kterou jsem musel do databáze dostat následující fintou:
insert into t_test values (add_months(to_date('01.01.0001 10:13:00','DD.MM.RRRR HH24:MI:SS'),-12))
mi to vrátí
+00 10:13:00.000000
a mělo by to v .NET jít přímo přemapovat na TimeSpan (to už jsem byl líný zkoušet)
Komentáře
- pilif : Jo, toto vypadá jako pěkné řešení. Typ TimeSpan mi to v EF v pohodě zpracoval. Jediná nevýhoda je použití toho "nativního" SQL místo EF. Ale co už :) Díky. Jen mi není jasné jak chápat hodnotu roku "0" v typu DATE Oraclu. — 25.2.2018
- KamilZ : Udělej si nad tou tabulkou view 1:1 ve kterém jen přemapuj ten sloupec a EF napoj na něj. Hodnota 0 v Date je pro Oracle chyba, to nechápej nijak :-) Ještě si to pořádně vyzkoušej, já to jen nastřelil. Nevím, jak dlouhý ten interval reálně můžeš mít, jestli třeba i desítky dnů atd. — 25.2.2018
Pro zobrazení všech 6 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře