Avatar billede devradio Nybegynder
10. november 2003 - 23:14 Der er 51 kommentarer og
1 løsning

Trække 2 datoer fra hinanden.

Jeg sidder her med et lille problem i mysql.

Jeg vil gerne trække 2 datoer fra hinanden.
Den ene dato ligger i en tubel kaldet time i formatet.
2003-11-10 20:04:04
og den dato der skal trækkes fra er tiden lige nu f.eks. NOW()
Det resultatet jeg gerne vil have er hvor lang tid er der gået siden timestampet i time() altså noget i stil med select * from time(blah blah blah)

Resultat:

0000-00-00 00:03:00

Så jeg kan se at der f.eks. er gået 3 timer siden jeg smed det timestamp ind i tublen time.

Har kigget meget i manualen på www.mysql.org men ikke fundet noget desværre.
Avatar billede erikjacobsen Ekspert
10. november 2003 - 23:20 #1
Du kan få antal sekunder der er gået med

select unix_timestamp(now())-unix_timestamp(tid) from

Jeg ved ikke om det giver meget mening at konvertere til 0000-00-00 00:00:00
med mindre der er gået mindre end en dag....
Avatar billede devradio Nybegynder
10. november 2003 - 23:24 #2
Enten er min tid ødelagt på serveren eller aner jeg ikke hvordan jeg skal konvertere tingene til noget jeg kan læse.
Hvis jeg prøver select FROM_UNIXTIME(92264479); for at kunne se det i normal form så får jeg

| FROM_UNIXTIME(92264479) |
+-------------------------+
| 1972-12-03 22:01:19    |
Og det kan da vidst ikke passe?
Avatar billede devradio Nybegynder
10. november 2003 - 23:25 #3
92264479 er det ene af de 2 resultater jeg får ud.
Avatar billede erikjacobsen Ekspert
10. november 2003 - 23:28 #4
Hvilke data sker beregningen på?
Avatar billede devradio Nybegynder
10. november 2003 - 23:29 #5
Ja jeg har lige lavet time om til UNIX_TIMESTAMP så det er lettere at rode med. Så det er faktisk 2 UNIX_TIMESTAMPS som bliver trukket fra hinanden. Og jeg skal bare bruge hvor lang tid der er gået imellem dem.
Avatar billede erikjacobsen Ekspert
10. november 2003 - 23:31 #6
Hvilke data sker beregningen på?
Avatar billede devradio Nybegynder
10. november 2003 - 23:32 #7
f.eks.
20001208022123 - NOW() = resultat

det skal så laves om til år-mdr-dag-timer-sec.
Avatar billede erikjacobsen Ekspert
10. november 2003 - 23:33 #8
20001208022123 er næppe et unix-timestamp ??
Avatar billede devradio Nybegynder
10. november 2003 - 23:35 #9
jeg smider data ind på denne måde INSERT INTO tabel12 (`teksttubel`,`time`) VALUES ('tekst',UNIX_TIMESTAMP())
Avatar billede erikjacobsen Ekspert
10. november 2003 - 23:38 #10
Så står der vel heller ikke 20001208022123, men mere i retning af  1068503847
Avatar billede detox Nybegynder
10. november 2003 - 23:40 #11
Du kan sikkert bruge SEC_TO_TIME():

SELECT SEC_TO_TIME(unix_timestamp(now()) - `time`) FROM `tabel12`
Avatar billede devradio Nybegynder
10. november 2003 - 23:40 #12
nej der står 20001208022123.
Men jeg lavede tabellen i sin tid med
create table tabel12 (tekst varchar(50), time TIMESTAMP(14)).
Avatar billede detox Nybegynder
10. november 2003 - 23:41 #13
Eller med dit oprindelige format:

SELECT SEC_TO_TIME(unix_timestamp(now()) - unix_timestamp(`time`)) FROM `tabel12`
Avatar billede erikjacobsen Ekspert
10. november 2003 - 23:41 #14
Sådan lige for at få tingene på det rene:

  20001208022123 er godt nok et tal, men man kan umiddelbart se dato og tid,
  og man kan ikke regne på det med + og -, slet slet ikke

  1068503847 repræsenterer antal sekunder siden verdens skabelse (1. januar 1970),
  og egner sig fint til at regne på. Addition og subtraktion af sekunder,
  giver .... sekunder.

Så, hvad står der i de data du arbejder på?
Avatar billede erikjacobsen Ekspert
10. november 2003 - 23:43 #15
Og en tilføjelse ... man kan ikke blande de to formater uden at omregne dem.

Jeg forstår stadig ikke hvad der står i dine data. Er det nu det ene eller det andet?
Avatar billede devradio Nybegynder
10. november 2003 - 23:45 #16
Tricket er at jeg skal smide den nuværende dato(år tid osv) ind når jeg smider noget i min tekst tubel. når jeg så udfører en kommando skal den fortælle mig hvor lang tid der er gået siden det er blevet smidt ind og til nu.
Jeg er sådan set ligeglad med hvad format det kommer til at ligge i da det er nye informationer jeg skal smide ind. Så hvis i har forslag til en anden opbyggelse af tabellen er jeg åben for forslag. Bare det kommer til at virke i sidste ende.
Avatar billede devradio Nybegynder
10. november 2003 - 23:46 #17
der skal kun være en tekst og en time tubbel.
Avatar billede detox Nybegynder
10. november 2003 - 23:49 #18
Hmm, ja måske du skulle holde dig til det oprindelige DATETIME. Det kan man udemærket omregne. Eller måske et 'timestamp', så behøver du ikke engang selv ligge det ind. Det bliver automatisk opdateret når du laver INSERT eller UPDATE.
Avatar billede erikjacobsen Ekspert
10. november 2003 - 23:50 #19
Skal du regne på det, så behold unixtime - vil det så ikke virke?

sec_to_time er så en god konvertering fra et antal sekunder der repræsentere
en kortere periode (fx. differens mellem to rigtig unixtimestamps). Er der
gået mere end een dag kan det se sjovt ud 300:07:09  er 300 timer 7 minutter
og 9 sekunder.
Avatar billede erikjacobsen Ekspert
10. november 2003 - 23:52 #20
Men hov - er det fordi du indsætter en unixtimestamp i et datetime felt?
Så bliver det vist konverteret. En unixtimestamp er bare en int(11)
Avatar billede devradio Nybegynder
10. november 2003 - 23:53 #21
Ja det er lige præcis de ting jeg vil undgå. Så hvis i har nogle forslag til hvordan det ellers kan bygges op er jeg åben for forslag. Det skal bare være ikke være alt for besværligt så ingen select sætninger over 600 tegn ;).
Avatar billede devradio Nybegynder
10. november 2003 - 23:54 #22
hmm ja der var måske noget.
Avatar billede detox Nybegynder
10. november 2003 - 23:54 #23
Jeg synes alle de rigtigt gode og anvendelige tid/dato funktioner er tilgængelig fra version 4.1.1 og den er vidst ikke klar endnu :(
Avatar billede devradio Nybegynder
10. november 2003 - 23:57 #24
Ja nu ser unix_timestamp osse bedre ud. Men hvordan undgik jeg det der med 300:07:09 problematikken.
Avatar billede erikjacobsen Ekspert
10. november 2003 - 23:57 #25
Der er kommet 2 forslag, ikke. Jeg holder på unixtimestamps hele vejen
igennem - det er hurtigst for maskinen. Andre har lov til men noget andet ... ;)
Avatar billede erikjacobsen Ekspert
10. november 2003 - 23:58 #26
Du kan selv regne på tallene. time_to_sec er bare en nem måde. Hvad vil
du have der skal stå i stedet for 300:07:09 ?
Avatar billede devradio Nybegynder
10. november 2003 - 23:59 #27
Ja nu virker unix_timestampen osse men jeg kan jo ikke smide 1068504934 ud som tid ;)
Avatar billede detox Nybegynder
10. november 2003 - 23:59 #28
Jamen jeg vil da holde med i at unixtimestamp er fint. Det kan jo altid konverteres.
Avatar billede devradio Nybegynder
10. november 2003 - 23:59 #29
bare år-mdr-dage-timer-sec
Avatar billede detox Nybegynder
11. november 2003 - 00:02 #30
Hvorfor ikke minutter?
Avatar billede erikjacobsen Ekspert
11. november 2003 - 00:02 #31
3-3-3-3-3-3    3 år 3 måneder 3 dage 3 timer 3 minutter og 3 sekunder
Sådan? Hvor lang er en måned? Og et år?
Avatar billede devradio Nybegynder
11. november 2003 - 00:02 #32
åh ja den havde jeg glemt tak. ;)
Avatar billede detox Nybegynder
11. november 2003 - 00:06 #33
Hvis du tænker hvordan du skal vise din tid, kan du bruge DATE_FORMAT. Fx:

SELECT DATE_FORMAT(FROM_UNIXTIMESTAMP(´time´),'%Y-%m-%d %H:%i:%s') AS tid FROM tabel12
Avatar billede detox Nybegynder
11. november 2003 - 00:06 #34
Men det var vidst et sidespor ;o)
Avatar billede erikjacobsen Ekspert
11. november 2003 - 00:07 #35
Ja, men den holder ikke på en differens mellem 2 unixtimestamps
Avatar billede detox Nybegynder
11. november 2003 - 00:08 #36
Naturligvis ikke!
Avatar billede detox Nybegynder
11. november 2003 - 00:09 #37
Men hvorfor ikke bare foretage dine sammenligninger direkte på sekunderne?
Avatar billede detox Nybegynder
11. november 2003 - 00:11 #38
Eller lav omregningen i applikationen.
Avatar billede erikjacobsen Ekspert
11. november 2003 - 00:11 #39
Hvor lang tid snakker vi typisk om? Dage, måneder, år? Og hvor præcis skal
det være? Er præcisionen relativ:

  1) For 6 minutter og 7 sekunder siden
  2) For godt 2 år siden
Avatar billede devradio Nybegynder
11. november 2003 - 00:13 #40
gerne op til 2år eller længere.
Avatar billede devradio Nybegynder
11. november 2003 - 00:14 #41
ja hvis i gider smide en konvertering i TCL så er det osse fint med mig ;) men ville dog helst have databasen til at gøre det.
Avatar billede erikjacobsen Ekspert
11. november 2003 - 00:14 #42
Ja, og så ... ?
Avatar billede devradio Nybegynder
11. november 2003 - 00:16 #43
Formatet det skal kunne vise ude koden er f.eks.

Tekst blev skrevet for 1 år 2 mdr 3 dage 21 timer 22 sec siden.
Avatar billede devradio Nybegynder
11. november 2003 - 00:16 #44
Og det kan være alt fra 1 sek. til så længe jeg vil køre med databasen.
Avatar billede erikjacobsen Ekspert
11. november 2003 - 00:20 #45
Hvis det skal være troværdigt med måneder og år kan man ikke bruge
differensen mellem to unixtimestamps. Den kan ikke se om man passerer
februar eller juli i det antal sekunder den nu består af.

Så skal du tilbage til DATETIME, og til at lave beregningen i din
applikation. TCL er ikke lige min kop varm mjød, desværre...
Avatar billede devradio Nybegynder
11. november 2003 - 00:23 #46
ok tak for det begge to. smid et svar hvis i vil have nogle point. Så må jeg bare tilbage til tegnebrættet ;)
Avatar billede detox Nybegynder
11. november 2003 - 00:38 #47
Du kan glæde dig til version 4.1.1. Der kommer ting som fx: DATEDIFF og TIMEDIFF.
Avatar billede devradio Nybegynder
11. november 2003 - 00:58 #48
Ja læste godt lidt om det. ;) så må de bare skynde sig.
Avatar billede erikjacobsen Ekspert
11. november 2003 - 00:58 #49
Ingen løsning, ingen point, tak.
Avatar billede detox Nybegynder
11. november 2003 - 02:07 #50
Hvis dit `time` felt er et unix timestamp, kan du få dage, timer, min. og sek.:

SELECT FLOOR(( UNIX_TIMESTAMP(NOW()) - `time`)/(60*60*24)) AS dage,
FLOOR(((UNIX_TIMESTAMP(NOW()) - `time`) % (60*60*24)) / 3600) AS timer,
FLOOR(((UNIX_TIMESTAMP(NOW()) - `time`) % 3600) / 60) AS min,
(UNIX_TIMESTAMP(NOW()) - `time`) % 60 AS sek
FROM  `tabel12`

En lang forespørgsel, men under de 600 tegn du foreskrev ;o)
Avatar billede detox Nybegynder
11. november 2003 - 02:09 #51
Men år og måneder er som sagt ikke muligt udfra sekunder.
Avatar billede devradio Nybegynder
23. januar 2004 - 13:12 #52
Skiftede til postgresql der virker det hele.!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester