Nekompatibilní Oracle DATE a .NET DateTime rubrika: Programování: .Net

4 pilif
položil/-a 24.2.2018

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.

Komentáře

  • KamilZ : Dej sem raději pár příkladů - insert do Oracle databáze (pro SQL*Plus) s příslušnými DATE hodnotami a významem, který by měly reprezentovat), jako ukázku, ať se to dá namodelovat. Jinak obecně ten EF provider pro .NET od Oracle jsme hodili po psovi a používáme devArt dotConnect for Oracle. 24.2.2018
odkaz Vyřešeno
4 KamilZ
odpověděl/-a 25.2.2018
 
upravil/-a 25.2.2018

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:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.