[PSQL] tijd in tabel aanpassen

Pagina: 1
Acties:

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 11:05

voodooless

Sound is no voodoo!

Topicstarter
Door een bug in een programma zijn datums van twee maanden fout opgeslagen. i.p.v de correcte maand is er 0 ingevuld in de perl functie om unix time te maken, waardoor dus alles in januarie valt. Nu is het zo dat het maar twee maanden fout is gegaan, dus dat valt wel te fixen. De datum is als een integer met UTC epoch opgeslagen.

Hiervoor wil ik de epoch naar text omzetten, door middel van een string replace de maand aanpassen, en vervolgens weer terugzetten naar een epoch integer. Een werkbaar plan lijkt me.

Deels lukt dat ook wel. Het enige probleem is de conversie van de tijd string terug naar epoch. Daarvoor wil in EXTRACT gebruiken.

Dat ziet er dan als volgt uit (voorlopig nog ff geen update maar een select om het goed te testen):

SQL:
1
2
SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE replace(text(abstime(enddate::int4)),'-01-','-11-')) 
FROM xxx WHERE id BETWEEN ? and ?;

(maand 01 replace ik dus met 11)

Dit geeft echter de volgende error:

code:
1
ERROR:  parser: parse error at or near "replace" at character 52


de replace zelf werkt prima, dat heb ik al getest. Het lijk erop dat zodra je EXTACT een dynamisch opgebouwde text voorschotelt, het niet meer werkt. Ik hoop dat iemand van jullie een oplossing heeft. Heb al vanalles geprobeerd te casten en om te zetten, maar het helpt allemaal niet :'(

Do diamonds shine on the dark side of the moon :?


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Moet TIMESTAMP WITH TIME ZONE niet ín die replace staan? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 11:05

voodooless

Sound is no voodoo!

Topicstarter
Lijkt me niet, replace werkt op text, en dus moet ik eerst die epoch int naar een tekst representatie omzetten, like: "2006-11-20 10:37:16+01". en dan zou dus die EXTRACT daarop moeten werken door die text weer naar timestap om te zetten met TIMESTAMP WITH TIME ZONE.

Do diamonds shine on the dark side of the moon :?


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Ja, maar replace is een functie met parameters, niet iets wat je zomaar ergens in je code dumpt en dan werkt. ;)

Mijn gok:
SQL:
1
2
SELECT REPLACE(EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE TEXT(ABSTIME(enddate::int4), '-01-','-11-')) 
FROM xxx WHERE id BETWEEN ? and ?;


edit:
Argh, negeer alles hierboven maar. :P
Overigens kun je toch ook iets doen als dit?
SQL:
1
UPDATE tabel SET veld = veld + INTERVAL '10 months' WHERE MONTH(veld) = 1 AND ...

[ Voor 9% gewijzigd door NMe op 10-01-2007 15:13 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 11:05

voodooless

Sound is no voodoo!

Topicstarter
Jou gok doet dus precies niet wat ik wil ;) Die replace werkt perfect, alleen moet die text dus terug naar een epoch integer, en daar gaat het mis.

Je tweede optie: werkt dus niet omdat het een integer is en geen timestamp ;) Dat is nu precies het probleem :P

edit: zet er een abstime() bij, en het werkt :+ Bij nader inzien niet. Hoe weet dat ding hoeveel 10 maanden is :? Aangezien dat vanaf iedere maand gerekend anders is gaat dat dus mis. De replace is dus de juiste methode!

code:
1
2006-11-17 10:31:26+01 | 2006-11-17 10:27:47+01

eerste is de replace, tweede de interval

Verschil is misschien niet groot, maar wel belangrijk.

[ Voor 44% gewijzigd door voodooless op 10-01-2007 15:24 ]

Do diamonds shine on the dark side of the moon :?


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

voodooless schreef op woensdag 10 januari 2007 @ 15:19:
edit: zet er een abstime() bij, en het werkt :+ Bij nader inzien niet. Hoe weet dat ding hoeveel 10 maanden is :? Aangezien dat vanaf iedere maand gerekend anders is gaat dat dus mis. De replace is dus de juiste methode!

code:
1
2006-11-17 10:31:26+01 | 2006-11-17 10:27:47+01

eerste is de replace, tweede de interval

Verschil is misschien niet groot, maar wel belangrijk.
Dat geloof ik graag, maar ik begrijp niet waar het verschil vandaan komt. Normaal gesproken zou dit moeten werken AFAIK. Aan de andere kant ben ik natuurlijk geen ster in PSQL. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 11:05

voodooless

Sound is no voodoo!

Topicstarter
Maar of ik nu het een of het ander neem, ik kan er nog steeds geen epoch integer van krijgen :'( Zo of zo is het probleem dus nog niet opgelost...

Edit: Oke dan... Tjonge, PSQL is echt zo flauw :'( Hier is ie dan:

SQL:
1
2
SELECT EXTRACT(EPOCH FROM replace(text(abstime(enddate::int4)),'-01-','-11-')::timestamp) 
FROM xxx WHERE id BETWEEN ? and ?;


d:)b

[ Voor 43% gewijzigd door voodooless op 10-01-2007 15:52 ]

Do diamonds shine on the dark side of the moon :?

Pagina: 1