Avatar billede dennism Nybegynder
07. februar 2007 - 21:01 Der er 12 kommentarer og
1 løsning

mySQL: tal til dato

Jeg sidder med en database, hvor udvikleren har valgt at gemme datoer som double. Det kan f.eks. være:

20040426.142013

Hvordan kan jeg få denne til at ligne en dato - f.eks. 26/04-2004?
Avatar billede razmuz_dk Nybegynder
07. februar 2007 - 21:42 #1
CONCAT(SUBSTRING(date, 7, 2), '/', SUBSTRING(date, 5, 2), '-', SUBSTRING(date, 1, 4))

Ser ikke superpænt ud.. men det burde i princippet virke :)
Avatar billede kabbak Professor
07. februar 2007 - 21:42 #2
Mn ikke den forstår denne, men det kræver at tallet altid er lige langt.

a = 20040426.142013
Dato = DateSerial(Left(a, 4), Mid(a, 5, 2), Mid(a, 7, 2)) + TimeSerial(Mid(a, 10, 2), Mid(a, 12, 2), Right(a, 2))
Avatar billede dennism Nybegynder
07. februar 2007 - 22:17 #3
razuz_dk >>

Din kode er mySQL-kode, ik?
Avatar billede kjulius Novice
07. februar 2007 - 22:33 #4
Du burde kunne konvertere det til en datetime variabel, hvorefter det kan formateres som en normal dato:

1. Din double variabel konverteres til en int eller bigint:
    CAST(dindate * 1000000 AS BIGINT)
2. Denne værdi konverteres til en karakterstreng:
    CAST(  AS CHAR(10))
3. Nu kan konverteres til en datetime:
    CAST(STR_TODATE(    ,'%Y%m%d%H%i%S') AS DATETIME)

Vi sætter det lige sammen (indefra og ud):
CAST(STR_TODATE(CAST(CAST( dindate * 1000000 AS BIGINT) AS CHAR(10), '%Y%m%d%H%i%S') AS DATETIME)

Vejen er nu vidt åbent for at formatere datoen som du ønsker:

DATE_FORMAT(  , '%d/%m-%Y')

Igen sætter vi lige sammen:
DATE_FORMAT(CAST(STR_TODATE(CAST(CAST( dindate * 1000000 AS BIGINT) AS CHAR(10), '%Y%m%d%H%i%S') AS DATETIME), '%d/%m-%Y')


Jeg har ikke haft mulighed for at teste ovenstående, som alene er baseret på et hurtigt kig i manualen, så jeg gir' selvsagt ingen garanti. :-)
Avatar billede razmuz_dk Nybegynder
07. februar 2007 - 22:34 #5
Jo, min kode er mysql - men den skal sættes ind i en kontekst for ikke at give fejl, hvis det er det du mener.
Avatar billede kjulius Novice
07. februar 2007 - 22:36 #6
Dooh!! CHAR(10) skal selvfølgelig være CHAR(14)!
Avatar billede kjulius Novice
07. februar 2007 - 22:59 #7
--> kabbak: Din kode er vist til Access, er det ikke?
Avatar billede dennism Nybegynder
07. februar 2007 - 23:34 #8
Hvordan vil i foreslå, at jeg gør det i PHP, når tallet ligger i $row['startDate']? Tror det er en bedre løsning, end at gøre det direkte i mySQL.

Beklager spørgsmålet placering.
Avatar billede razmuz_dk Nybegynder
07. februar 2007 - 23:42 #9
$date = $row['startDate'];
$time = mktime(substr($date, 9, 2), substr($date, 11, 2), substr($date, 13, 2), substr($date, 4, 2), substr($date, 6, 2), substr($date, 0, 4));
$new_date = date("%d/%m %Y, %H:%i:%s", $time);

Sådan kunne man gøre - kig evt i php-manualen for substr(), mktime() og date() for at forstå hvorfor jeg gør som jeg gør. Ovenstående er ikke testet, men burde i princippet virke.

Dog vil jeg ikke anbefale ovenstående løsning hvis der bliver tung trafik på dit website eller hvis du er ved at lave et større projekt - det er ikke den optimale løsning.
Avatar billede dennism Nybegynder
08. februar 2007 - 00:08 #10
Tak, rasmus :) Smider du lige et svar?
Avatar billede razmuz_dk Nybegynder
08. februar 2007 - 00:14 #11
Jep :)
Avatar billede dennism Nybegynder
08. februar 2007 - 00:18 #12
Efter at have fjernet % i date-funktionen kørte det :)
Avatar billede razmuz_dk Nybegynder
08. februar 2007 - 00:28 #13
Nåeh ja, jeg blandede lige php og mysql sammen der :-) i MySQL skal du nemlig bruge %

Godt du selv kunne finde ud af det :)
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