Avatar billede webcreator Nybegynder
14. maj 2003 - 16:57 Der er 34 kommentarer og
3 løsninger

Dato og tid. Samme celle eller seperate ?

Hej.

Jeg har en tabel med flg. felt :
    dato date NOT NULL

Jeg ville dog gerne have et felt, der både kan indeholde dato og tid. Er det muligt ?

Eller kan jeg blot smide dem i hver deres celle ? og findes der i givet fald så en bestemt celle-type for tid ?

Hvad er fordelene ved at bruge et dato-felt som det jeg bruger ? For hvis ikke, så kan jeg vel blot brug en normal VARCHAR-celle.
Avatar billede kaptajnkemo Nybegynder
14. maj 2003 - 17:08 #1
Der er nok af muligheder....

Brug evt. datetime hvis du vil slå det sammen.

Brug ALDRIG varchar til date. Varchar indeholder en tekst streng mens date indeholder et date-objekt.

Bruger du tekststrengen får du problemer med datofunktioner, f.eks. sammenligninger af to datoer....
Avatar billede ohmish Nybegynder
14. maj 2003 - 17:08 #2
brug datetime... det indeholder begge.
Avatar billede staf Nybegynder
14. maj 2003 - 17:08 #3
Jeg har været ude i noget af det samme som dig. Jeg ville gerne have et felt til dato, tid, måned, ugedag og år.
Min løsning blev en kolonne for hver.
Mht. datoen, så valgte jeg at se bort fra mysql`s egen datoformat. Og oprettede istedet feltet som en almindelig char, på 2 karaterer. PHP generere så datoen, som jeg herefter smider ned i tabellen.
Dog skal du lige overveje om din side skal bruges i udlandet også. I så fald er det mere hensigtsmæssigt at bruge et clientsite script til at generere tiden ihvertfald!

Mht. datatype til tid, bruger jeg ligeledes en almindelig char type på 5. Tiden bliver så vist som 00:00!!
Avatar billede staf Nybegynder
14. maj 2003 - 17:12 #4
Mht. sammenligning at dato, så kan der opstå problemer som nævnes i første svar. Skiller du det KOMPLET ad (har jeg gjort), så har du faktisk kun et tal i datokolonnen. Sammenholdt med måned-kolonnen, har jeg ikke oplevet problemer.

Vælger du at datoen genereres som eks. 20.05.2003, altså sammenholder både dato, måned og år, så kan baladen opstå.....
Avatar billede kaptajnkemo Nybegynder
14. maj 2003 - 17:18 #5
Staf>

Select * from tabel where dato="noget vrøvl" :)

Det giver efter min mening en meget dårlig vane at gøre sådan.
Brug altid date/time felterne, de er til for det samme...

Hvorfor har du valgt at gøre som du nævner i dit eksempel?
Avatar billede peturkirke Novice
14. maj 2003 - 17:20 #6
hvis du senere skal til at sammenligne datoer og klokkesletter, er det meget godt at bruge date/time felter
Avatar billede webcreator Nybegynder
14. maj 2003 - 17:24 #7
Jeg bruger udelukkende datoen samt tiden for oprettelse af brugere. Jeg logger tid, dato og IP.
Avatar billede webcreator Nybegynder
14. maj 2003 - 17:25 #8
Hvordan skal formatet se ud, ved lagring af dato og tid ? Pt. ser mit sådan ud :

$dato = date("d/m-y - H:i:s");
Avatar billede morw Nybegynder
14. maj 2003 - 17:27 #9
$mysql_format = date("Y-m-d H:i:s", time());
Avatar billede kaptajnkemo Nybegynder
14. maj 2003 - 17:27 #10
web:> hvis du kun skal bruge dagsdato og nuværende klokkeslet så brug mysql's now().
Avatar billede webcreator Nybegynder
14. maj 2003 - 17:29 #11
Kaptajn > Cool. Sådan her :
$tid = $mysql_now();  ?

Men lagres det så i det korrekte format ?
Avatar billede morw Nybegynder
14. maj 2003 - 17:31 #12
INSERT INTO test (datofelt) VALUES (now());
Avatar billede kaptajnkemo Nybegynder
14. maj 2003 - 17:32 #13
jeps, sådan som morw skriver...
Avatar billede staf Nybegynder
14. maj 2003 - 17:35 #14
Ja, kan godt være min metode er ret alternativ. Jeg har simpelthen bare valgt at skille $mysql_format = date("Y-m-d H:i:s", time()); ad, således at jeg får hver oplysning ned i sit eget felt.

Giver mig sådan set ingen problemer i en select:

(SELECT * FROM registreringer WHERE dato ='5' ORDER by maaned asc);
eller hvad det nu måtte være.......
Jeg valgte metoden idet jeg gerne ville kunne søge selvstændigt på hhv. dato, tid måned og år.....
Avatar billede morw Nybegynder
14. maj 2003 - 17:36 #15
staf> det kan du også selvom du bruger datetime som datatype
Avatar billede kaptajnkemo Nybegynder
14. maj 2003 - 17:38 #16
staf> ok, i dit tilfælde vil det måske være nemmest.... Men så er det vist også undtagelsen som bekræfter reglen :)
Avatar billede staf Nybegynder
14. maj 2003 - 17:40 #17
Ja OK!
Gjorde det nu også for nemmere at kunne skille dem ad, når jeg udskriver dem. Dette kan jeg så formentlig OGSÅ gøre med "datetime". Men nu kører det fint, som det er. Kan godt se at det andet måske er mindre omfattende. Og jeg vil således overveje det en anden gang.

Det er vel nok et sp. om erfaring. Jo mere erfaring man med tiden får, jo smartere metoder finder man naturligvis også :)
Avatar billede kaptajnkemo Nybegynder
14. maj 2003 - 17:45 #18
staf> Det er jo netop derfor vi nævner det....
Det kunne være der var en helt speciel årsag til at det er smart i dit tilfælde. Det er dog ikke ensbetydende med at det er godt i alle tilfælde. Hvis du siger det er et udslag af manglende erfaring er det da helt ok, det kan man jo ikke bebrejde nogen.

Det ville bare være synd at lære "dårlig" kode fra sig når andre også mangler erfaringen.
Avatar billede morw Nybegynder
14. maj 2003 - 17:47 #19
Jeps, normalt bruger man MONTH(), YEAR(), DAY() o.s.v. hvis man skal søge på de enkelte parametere
Avatar billede ohmish Nybegynder
14. maj 2003 - 17:48 #20
en måde at lege med datetime:

$gammel = date("Y-m-d H:i:s", (time()-241920)); // 30 dage
$hent = "SELECT tid FROM beskeder WHERE tid<'$gammel' ";
$nrow = @mysql_query($hent);

$datotid = explode(" ", $nrow["tid"]);
$data = explode("-", $datotid[0]);
$nyyear = $data[0];
$nymonth = $data[1];
$nyday = $data[2];
$montharr = array ("januar","februar","marts","april","maj","juni","juli","august","september","oktober","november", "december");
$nymonth = $montharr[$nymonth-1];

echo "$nyday. $nymonth $nyyear kl. $datotid[1]";
Avatar billede ohmish Nybegynder
14. maj 2003 - 17:50 #21
på den måde har du et pænere dansk format, men også det rå brugbare format klar.
ovenstående ville give f.eks:

3. december 2002 kl. 21:45
Avatar billede webcreator Nybegynder
14. maj 2003 - 17:52 #22
Datoen skal blot smides i en variabel.
Så hvad er korrekt ? :
-> $tid = $mysql_now();
-> $tid = now();
Avatar billede kaptajnkemo Nybegynder
14. maj 2003 - 17:55 #23
ingen af delene...

når du laver dit insert gør du følgende:

INSERT INTO tabel(dato, felt1) VALUES(now(), value1)....
Avatar billede webcreator Nybegynder
14. maj 2003 - 17:56 #24
jamen datoen ska med over til en anden fil - derfor skal den ligge i en variabel. Senere bliver den indsat i tabellen.
Avatar billede webcreator Nybegynder
14. maj 2003 - 17:57 #25
.. og jeg har ikke haft held til, at få de to førnævnte metoder til at virke..
Avatar billede webcreator Nybegynder
14. maj 2003 - 17:57 #26
jeg smider lige ldit flere points i..
Avatar billede kaptajnkemo Nybegynder
14. maj 2003 - 17:58 #27
datoen bliver skabt af DATABASEN ikke af php...

Der hvor du laver dit insert, uanset hvilken fil, skriver du din insert med
now()....
Avatar billede webcreator Nybegynder
14. maj 2003 - 17:59 #28
ah, IC. Det er måske meget smart :)
tak for rådet :)
Avatar billede kaptajnkemo Nybegynder
14. maj 2003 - 18:01 #29
Det var da så lidt.... og ja det er smart :)

Der er ingen grund til at bekymre sig om at smide dagsdato frem og tilbage... den kan ALTID skabes hvor den skal bruges hvad enten det er DB eller php som skal bruge den. Du skal nøjes med at flytte de data som brugeren selv indtaster.
Avatar billede webcreator Nybegynder
14. maj 2003 - 18:08 #30
Hm, det var kun datoen der kom med ved now();

Hvilken parameter kan jeg give, for at tiden kommer med ?
Avatar billede kaptajnkemo Nybegynder
14. maj 2003 - 18:11 #31
hvis du indsætter i et datetime eller time felt kommer tiden også med....
Avatar billede webcreator Nybegynder
14. maj 2003 - 18:12 #32
Ah, det var jo kun et date-felt :)
That's why :)
Avatar billede staf Nybegynder
14. maj 2003 - 18:14 #33
(genereret af PHP) $tid = date("h:i");

medmindre du vil have tiden sammen med alt det andet :)

>kaptajnkemo
"Det ville bare være synd at lære "dårlig" kode fra sig ........." Nu er det vel mere et sp. om specifik mysql teori, og ikke decideret kodning. Men buker med da naturligvis pænt for bedre forslag, i det pågældende tilfælde ;)
Avatar billede webcreator Nybegynder
14. maj 2003 - 18:16 #34
Jeg siger mange tak for hjælpen :)
Hvis der er en af jer, der lige vil tjene 5 points mere, så kan I jo passende svare på, hvordan jeg ordner det sådan, at den første indtastning forbliver som den er indtastet, og ikke laves om :
1. : 041191
2. : 41191

(Det er en fødselsdag)
Avatar billede kaptajnkemo Nybegynder
14. maj 2003 - 18:21 #35
staf> Udtrykket dårlig kode er i mangel af bedre. Jeg mener bare at det ikke er god stil at bruge datatyperne som du nævner (med mindre der absolut ikke er anden mulighed). I dette tilfælde drejer det sig jo netop om databaseteori, og det er mere eller mindre fastlagt hvordan man skal (bør) forholde sig til det. Min databaseteori siger i hvertfald at man skal bruge de korrekte datatyper når det er muligt ;)
Avatar billede webcreator Nybegynder
14. maj 2003 - 18:48 #36
tak for hjælpen :)
Avatar billede staf Nybegynder
14. maj 2003 - 21:28 #37
>kaptajnkemo

vi er helt enige ;)
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