Discussion:
[Oracle] - da się ustawić inny format danych na połączeniu?
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Diabl0
2009-05-25 09:20:12 UTC
Permalink
Witam

Zmuszony jestem korzystać z bazy danych jednej z aplikacji używanych w
firmie. Baza stoi na ORACLE (10.2.0.1.0), i jakiś ynteligentny inaczej
"programista" wymyślił sobie aby zamiast NULL wstawiać "1980-01-01
00:00:00" dla nieznanych dat (przez grzeczność nie napiszę jaka firma
pisała ten system). Pole jest zdefiniowane jako DATE (7). W ZF jako
wynik dostaję date w formacie 01-JAN-00 (w końcu idzie zwykłe zapytanie
typu SELECT * FROM), i teraz problem, czy to jest faktycznie 1 stycznia
2000 (jest kilka takich rekordów) czy też 1 stycznia 1800 roku (czyli
nieznana data).

Stąd moje pytanie czy da się w Oraclu ustawić na połączeniu inny format
danych? Podkreślam - na konkretne połączenie nawiązane przeze mnie, bo
znając życie zmiana formatu dla całej bazy wykrzaczy tamten system :/
--
K.
WiWiW
2009-05-25 09:31:18 UTC
Permalink
Post by Diabl0
Witam
Zmuszony jestem korzystać z bazy danych jednej z aplikacji używanych w
firmie. Baza stoi na ORACLE (10.2.0.1.0), i jakiś ynteligentny inaczej
"programista" wymyślił sobie aby zamiast NULL wstawiać "1980-01-01
00:00:00" dla nieznanych dat (przez grzeczność nie napiszę jaka firma
pisała ten system). Pole jest zdefiniowane jako DATE (7). W ZF jako
wynik dostaję date w formacie 01-JAN-00 (w końcu idzie zwykłe zapytanie
typu SELECT * FROM), i teraz problem, czy to jest faktycznie 1 stycznia
2000 (jest kilka takich rekordów) czy też 1 stycznia 1800 roku (czyli
nieznana data).
Stąd moje pytanie czy da się w Oraclu ustawić na połączeniu inny format
danych? Podkreślam - na konkretne połączenie nawiązane przeze mnie, bo
znając życie zmiana formatu dla całej bazy wykrzaczy tamten system :/
--
K.
Więc jeżeli używasz np SQL Developera (darmowe Oracle-owe narzedzie do
grzebania w bazie) to w opcjach w parametrach NLS masz format daty
który możesz sobie zdefiniować i oczywiście będzie to używane tylko i
wyłącznie w twojej sesji przez SQL Developera. Jeżeli piszesz to w
innym narzędziu to wystarczy użyć funkcjo to_char. Np

select to_char(sysdate, 'DD/MM/YYYY HH24:MI') from dual

i w tedy też wszystko bedziesz wiedział.

Pozdrawiam
Wojciech Cieplak
2009-05-25 09:37:26 UTC
Permalink
Post by Diabl0
Witam
Zmuszony jestem korzystać z bazy danych jednej z aplikacji używanych w
firmie. Baza stoi na ORACLE (10.2.0.1.0), i jakiś ynteligentny inaczej
"programista" wymyślił sobie aby zamiast NULL wstawiać "1980-01-01
00:00:00" dla nieznanych dat (przez grzeczność nie napiszę jaka firma
pisała ten system). Pole jest zdefiniowane jako DATE (7). W ZF jako
wynik dostaję date w formacie 01-JAN-00 (w końcu idzie zwykłe zapytanie
typu SELECT * FROM), i teraz problem, czy to jest faktycznie 1 stycznia
2000 (jest kilka takich rekordów) czy też 1 stycznia 1800 roku (czyli
nieznana data).
Stąd moje pytanie czy da się w Oraclu ustawić na połączeniu inny format
danych? Podkreślam - na konkretne połączenie nawiązane przeze mnie, bo
znając życie zmiana formatu dla całej bazy wykrzaczy tamten system :/
Pytaj o year(<pole>) i to da ci odpowiedź.
Można też pytać o to_char(<pole>,'rrrr-mm-dd')
Diabl0
2009-05-25 10:36:39 UTC
Permalink
Post by Wojciech Cieplak
Pytaj o year(<pole>) i to da ci odpowiedź.
Można też pytać o to_char(<pole>,'rrrr-mm-dd')
I tutaj jest problem z warstwą abstrakcji (PDO) oraz modelami (ZF).
Musiałbym wtedy samemu tworzyć zapytania lub przed zwróceniem wartości
daty robić podzapytania czego miałem nadzieję uniknąć.

Heh, im dłużej jestem zmuszony pracować z Oracle, tym bardziej go nie
lubię :(
--
K.
Replay
2009-05-27 05:04:56 UTC
Permalink
Post by Diabl0
Post by Wojciech Cieplak
Pytaj o year(<pole>) i to da ci odpowiedź.
Można też pytać o to_char(<pole>,'rrrr-mm-dd')
I tutaj jest problem z warstwą abstrakcji (PDO) oraz modelami (ZF).
Musiałbym wtedy samemu tworzyć zapytania lub przed zwróceniem wartości
daty robić podzapytania czego miałem nadzieję uniknąć.
Heh, im dłużej jestem zmuszony pracować z Oracle, tym bardziej go nie
lubię :(
--
K.
Ale przecież wystarczy w zmiennych na stacji klienta ustawić:
NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS" i nie ma problemu (nie trzeba
ingerować w sesje), także nie bardzo rozumiem po co robić dodatkowe
podzapytania?

Maciej.
Lucyna Witkowska
2009-05-25 10:24:43 UTC
Permalink
Post by Diabl0
Zmuszony jestem korzystać z bazy danych jednej z aplikacji używanych w
firmie. Baza stoi na ORACLE (10.2.0.1.0), i jakiś ynteligentny inaczej
"programista" wymyślił sobie aby zamiast NULL wstawiać "1980-01-01
00:00:00" dla nieznanych dat (przez grzeczność nie napiszę jaka firma
pisała ten system). Pole jest zdefiniowane jako DATE (7). W ZF jako
wynik dostaję date w formacie 01-JAN-00 (w końcu idzie zwykłe zapytanie
typu SELECT * FROM), i teraz problem, czy to jest faktycznie 1 stycznia
2000 (jest kilka takich rekordów) czy też 1 stycznia 1800 roku (czyli
nieznana data).
Stąd moje pytanie czy da się w Oraclu ustawić na połączeniu inny format
danych? Podkreślam - na konkretne połączenie nawiązane przeze mnie, bo
znając życie zmiana formatu dla całej bazy wykrzaczy tamten system :/
Rozumiem, ze nie mozesz ingerowac w aplikacje.
Formatem daty steruje zmienna systemowa NLS_DATE_FORMAT
zmien ją dla swojej sesji na 'dd-mm-yyyy'
Mozna to zrobic dla sesji tez przez
ALTER SESSION SET nls_date_format = 'dd-mm-yyyy', ale w tym
przypadku lepiej przez ustawienie tej zmiennej na stale.
Tylko w zle napisanych aplikacjach moze to zmienic tez sposob wczytywania
daty.

Pozdrowienia,
--
Lucyna Witkowska
pwola
2009-05-27 19:53:13 UTC
Permalink
Też trafiłem na taki kwiatek.

Poradziłem sobie tak:

select decode( data1, to_date('1980-01-01', 'YYYY-MM-DD'), null,
data1) data1_ok from table1

Ostatecznie można zrobić odczytywać tabelę przez view z taką
instrukcją

Piotr W.
Post by Diabl0
Witam
Zmuszony jestem korzystać z bazy danych jednej z aplikacji używanych w
firmie. Baza stoi na ORACLE (10.2.0.1.0), i jakiś ynteligentny inaczej
"programista" wymyślił sobie aby zamiast NULL wstawiać "1980-01-01
00:00:00" dla nieznanych dat (przez grzeczność nie napiszę jaka firma
pisała ten system). Pole jest zdefiniowane jako DATE (7). W ZF jako
wynik dostaję date w formacie 01-JAN-00 (w końcu idzie zwykłe zapytanie
typu SELECT * FROM), i teraz problem, czy to jest faktycznie 1 stycznia
2000 (jest kilka takich rekordów) czy też 1 stycznia 1800 roku (czyli
nieznana data).
Stąd moje pytanie czy da się w Oraclu ustawić na połączeniu inny format
danych? Podkreślam - na konkretne połączenie nawiązane przeze mnie, bo
znając życie zmiana formatu dla całej bazy wykrzaczy tamten system :/
Loading...