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.
- 1345 megtekintés
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!
- A hozzászóláshoz be kell jelentkezni
select (to_timestamp('20060101001003','YYYYMMDDHHMISS') + interval '3 years 2 month 1 day');
- A hozzászóláshoz be kell jelentkezni
már csak a visszatérési érték miatt:
SELECT to_char(to_timestamp('20060101001003','YYYYMMDDHHMISS') + interval '3 years 2 month 1 day','YYYYMMDDHHMISS');
--
Viszlát, és kösz a halakat!
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
SELECT log_timestamp from log where log_timestamp<2007 and log_id=20
Ez hány rekordot ad neked vissza?
- A hozzászóláshoz be kell jelentkezni
Ez naná, hogy visszaadja az összeset, a kolléga ott tévedett, hogy a függvény paraméterébe nem egyetlen adatot, hanem egy recordsetet eredményező lekérdezést írt.
--
Viszlát, és kösz a halakat!
- A hozzászóláshoz be kell jelentkezni
Gondoltam, hogy egy log nevű táblában esetleg a log_id nevű mező bírhat elsődleges kulcs jellemzőkkel, de mivel a hibaüzenet elég beszédes (több sort ad vissza), ezek szerint az akkor bizony mégsem PK.
- A hozzászóláshoz be kell jelentkezni
Mondjuk, tényleg fura :-)
IMHO a log_id inkább egy esemény azonosítója lehet, mint primary key.
--
Viszlát, és kösz a halakat!
- A hozzászóláshoz be kell jelentkezni
Arra talán találóbb lenne egy log_event_id és mondjuk FK, de ebbe most ne menjünk bele. :)
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
Nem próbáltál esetleg 1-1 log üzenetet beszúrni az update és select után és előtt kezdési és befejezési idő mérésre, hogy melyik fogja meg ennyire?
- A hozzászóláshoz be kell jelentkezni
Biztos, hogy a select, mert ha az eljárásban csak az update szerepel, akkor gyors.
--
Viszlát, és kösz a halakat!
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
MySQL-lel ugyanez hogyan nézne ki? Lehet-e általánosítani hogy megegye ez is, az is?
- A hozzászóláshoz be kell jelentkezni
Nem dolgozom mssql-el, de az sql elvileg szabvány.
Persze a beépített függvények eltérhetnek, de az elv ugyanaz.
szerk: mysql-t akartam írni :-)
--
Viszlát, és kösz a halakat!
- A hozzászóláshoz be kell jelentkezni
Az mssql is játszik, absztraktoron keresztül, csak kíváncsi vagyok mekkora az esély ilyen lekérdezés írására, ami működne my- ms- és pgsqlben.
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
Köszi!
- A hozzászóláshoz be kell jelentkezni
Köszönöm! Ez volt a helyes megoldás! Nagy vagy!
- A hozzászóláshoz be kell jelentkezni