Avatar billede googolplex Novice
17. oktober 2004 - 13:21 Der er 22 kommentarer og
2 løsninger

Datetime eller timestamp

Jeg skal have oprettet følgende i MySQL (via PHP).

1. Dato og tid for hvornår posten er oprettet (i created).
2. Dato og tid for hvornår posten sidste er opdateret/rettet (i opdated).

Jeg plejer at gøre det i PHP og så bare gemme et time()stamp i INT(10), men nu vil jeg gerne have MySQL til at gøre det.

Jeg vil gerne have gemt det som følgende:

17-10-2004 13:18:42 (eller 17-10-2004 13-18-42).

Hvordan gør jeg ?

Er det desuden smartest at gemme det som TIMESTAMP eller DATETIME ?
Avatar billede arne_v Ekspert
17. oktober 2004 - 13:23 #1
DATETIME

TIMESTAMP opdateres automatisk hver gang recorden opdateres
Avatar billede arne_v Ekspert
17. oktober 2004 - 13:25 #2
En DATETIME gemmes binært og formatet er kun noget der bruges i forbindlese med
input og output.
Avatar billede arne_v Ekspert
17. oktober 2004 - 13:26 #3
Jeg mener at du i MySQL INSERT kan bruge NOW()
Avatar billede googolplex Novice
17. oktober 2004 - 13:36 #4
Skal jeg så bruge DATETIME til at angive hvornår posten er oprettet og TIMESTAMP tilat angive hvornår posten sidst er opdateret ?

Er der ikke noget med, at hvis man har to identiske, så bliver den ene kun ændret når posten oprettes, den anden hver gang posten ændres ?
Avatar billede hmortensen Nybegynder
17. oktober 2004 - 13:44 #5
Man kan godt undgå at opdatere et TIMESTAMP felt, ved sætte værdien til sig selv:
UPDATE tabel SET felt = 'værdi', dato = dato
Avatar billede googolplex Novice
17. oktober 2004 - 13:46 #6
Ok, men hvad er så bedst at bruge i mit tilfælde ?
Avatar billede arne_v Ekspert
17. oktober 2004 - 13:50 #7
created absolut DATETIME

lastmodified kan du bruge DATETIME til hvis du er glad fir den automatiske
opdatering - det er jeg ikke så jeg ville bruge DATETIME også
Avatar billede hmortensen Nybegynder
17. oktober 2004 - 13:51 #8
Jeg ved faktisk ikke hvad der er smartest. Jeg bruger altid selv timestamp, men om det er bedst, ved jeg ikke. På begge felt typer kan du bruge DATE_FORMAT()

Hvis jeg husker rigtigt er det sådan her:
SELECT DATE_FORMAT(datofelt, "%d-%m-%Y %H:%i:%s") AS nydato FROM ....

Når du indsætter data, og du har et timestamp felt, skal du ikke proppe noget i feltet, så vil det automatisk lave en NOW()
Avatar billede hmortensen Nybegynder
17. oktober 2004 - 14:06 #9
"lastmodified kan du bruge DATETIME til hvis du er glad fir den automatiske
opdatering - det er jeg ikke så jeg ville bruge DATETIME også"

- Mente du ikke TIMESTAMP første gang ?
Avatar billede googolplex Novice
17. oktober 2004 - 14:06 #10
arne_v:

lastmodified kan du bruge DATETIME til hvis du er glad fir den automatiske
opdatering - det er jeg ikke så jeg ville bruge DATETIME også

Øhh :-)

Kan jeg bruge DATE_FORMAT på både TIMESTAMP og DATETIME ?
Avatar billede arne_v Ekspert
17. oktober 2004 - 14:07 #11
hmortensen>

Jo selvfølgelig
Avatar billede hmortensen Nybegynder
17. oktober 2004 - 14:12 #12
Ja, og du kan også bruge date_format på date typen

Men som sagt ved jeg ikke hvad der er bedst. Arne ved sikkert medre om det end jeg.
Men det kan vel stort set være underordnet, så længe at ens sql kald, passer overens med felttypen
Avatar billede arne_v Ekspert
17. oktober 2004 - 14:15 #13
Jeg ved skam ikke så meget.

Men jeg har hørt flere der har haft problemer fordi den automatiske
opdatering drillede dem.
Avatar billede hmortensen Nybegynder
17. oktober 2004 - 14:18 #14
Men det kan man komme uden om, som jeg skrev, ved at sætte værdien til sig selv.
Avatar billede googolplex Novice
17. oktober 2004 - 14:21 #15
Ok, nu skal jeg lige have det helt på plads :)

Når jeg bruger INSERT, så bruger jeg enten NOW() eller '' og så indsættes den korrekte dato/tid, hvad enten jeg bruger DATETIME/TIMESTAMP.

Når jeg bruger UPDATE, så ændres TIMESTAMP automatisk.

Når jeg bruger UPDATE, så ændres DATETIME ikke, med mindre jeg indsætter specifikt med NOW().

Er det korrekt ?
Avatar billede googolplex Novice
17. oktober 2004 - 14:39 #16
Ok, så er jeg kommet frem til følgende:

CREATE TABLE `fooditems` (
  `fooditem_id` mediumint(5) unsigned NOT NULL auto_increment,
  `name` varchar(50) NOT NULL default '',
  `energy` mediumint(5) unsigned NOT NULL default '0',
  `carbonhydrate` float(5,2) unsigned NOT NULL default '0.00',
  `protein` float(5,2) unsigned NOT NULL default '0.00',
  `fat` float(5,2) unsigned NOT NULL default '0.00',
  `created` datetime NOT NULL default '0000-00-00 00:00:00',
  `modified` timestamp(14) NOT NULL,
  PRIMARY KEY  (`fooditem_id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;

Fandt desuden denne gennemgang:

http://mbn.dk/?aid=28
Avatar billede hmortensen Nybegynder
17. oktober 2004 - 14:39 #17
Du kan også sætte default value til NOW() på oprettelses feltet
Avatar billede googolplex Novice
17. oktober 2004 - 14:40 #18
Ok, gør den ikke det automatisk når jeg bruger INSERT ?
Avatar billede googolplex Novice
17. oktober 2004 - 14:42 #19
Hmm, hvordan gør jeg det, den retter det tilbage :)
Avatar billede arne_v Ekspert
17. oktober 2004 - 14:55 #20
Bruger du PHPMyAdmin ?

Du kan ændre felter med ALTER TABLE - http://dev.mysql.com/doc/mysql/en/ALTER_TABLE.html
Avatar billede googolplex Novice
17. oktober 2004 - 16:24 #21
Ja, jeg ændrer standard værdie3n fra '0000-00-00 00:00:00' til 'NOW()' via phpMyAdmin. Funker ikke :(
Avatar billede googolplex Novice
17. oktober 2004 - 16:55 #22
Nå, man kan ikke bruge NOW(), drop et svar begge.
Avatar billede arne_v Ekspert
17. oktober 2004 - 17:14 #23
kommer her
Avatar billede hmortensen Nybegynder
17. oktober 2004 - 18:37 #24
Og endnu et
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