Dátum módosítása postgresql ben [megoldva]

Hali,

Van egy mezom: timestamp character(14)
es igy a valójában: 20060101001003

Hogy tudnám ezt manipulálni valami egyszerű módon? Sajna a + interval '3 year 2 month 1 day' nem működik.

Köszi,
Sz.

Hozzászólások

Nem értem egészen.
Akkor most timestamp, vagy varchar?
mi a mező pontos definíciója?

--
Viszlát, és kösz a halakat!

select (to_timestamp('20060101001003','YYYYMMDDHHMISS') + interval '3 years 2 month 1 day');

Köszönöm! Tényleg erre lett volna szükségem. Már csak egy kis kérdésem lenne:
Hogy tudnám ezt egy select-be beágyazni. Tudniilik, elcsuszott valami miatt a rendszeroram a db alatt es rossz timestamp-eket adott vissza, nem keves rekordhoz.

Most igy probaltam:
SELECT to_char(to_timestamp((SELECT log_timestamp from log where log_timestamp<2007 and log_id=20),'YYYYMMDDHHMISS') + interval '3 years 2 month 1 day','YYYYMMDDHHMISS');

Ha limit 1-el megy a query, akkor rendben lefut, de ha tobbel, akkor:
ERROR: more than one row returned by a subquery used as an expression

Megegyszer köszi a segítséget. Amint fentebb latszik sajna nem vagyok sql guru, és aki értett hozzá készíette már nincs a cégnél.

De ha már beszélgetünk...

OFF
Tegnap egy olyan problémába futottam bele, hogy egy kétlépcsős tranzakció (egy update és egy select) ha kiadom konzolon egymás után, akkor elképesztően gyorsan lefut (>2000000 rekordos tánlán), használja rendesen az indexeket, de ha ezt a két utasítást egy eljárásban tárolom és futtatom az eljárást, akkor rohadt lassú....
Hogy ez mitől lehet?
--
Viszlát, és kösz a halakat!

Attól függ, mit akarsz.
Ha csak select-re akarod átírni, akkor:

SELECT to_char(to_timestamp(log_timestamp,'YYYYMMDDHHMISS') + interval '3 years 2 month 1 day','YYYYMMDDHHMISS') from log where log_timestamp<2007 and log_id=20;

még pontosabb így lesz, ha a "jó" értékeket is látni akarod:
SELECT CASE WHEN log_timestamp<2007 and log_id=20 THEN to_char(to_timestamp(log_timestamp,'YYYYMMDDHHMISS') + INTERVAL '3 years 2 month 1 day','YYYYMMDDHHMISS')::text ELSE log_timestamp::text END FROM log WHERE ....

a "::text" adatkonverziós direktíva lehet, hogy nem kell, de ártani nem árt. Azért írtam csak bele, hogy ha a log_timestamp mező típusa esetleg más lenne, mint a to_char függvény visszatérési adattípusa.

Ha véglegesen szeretnéd rendbetenni az adatbázist, akkor:

UPDATE log SET log_timestamp = (SELECT to_char(to_timestamp(log_timestamp,'YYYYMMDDHHMISS') + INTERVAL '3 years 2 month 1 day','YYYYMMDDHHMISS')) WHERE log_timestamp<2007 AND log_id=20;

ezt értelemszerűen csak egyszer kell kiadnod, és ez "helyreteszi" a hibás mező-értékeket.

--
Viszlát, és kösz a halakat!

ha ugyanezek a beépített függvények (to_char és to_timestamp) léteznek az említett adatbázis-szoftverekben, akkor természetesen változtatás nélkül működni fognak. Úgy tudom, hogy a ::text converzió és a case when ... then ... else ... end vezérlőszerkezet szabványosak, és működnek, de lehet, hogy tévedek.

--
Viszlát, és kösz a halakat!