13. december 2004 - 10:51Der er
21 kommentarer og 1 løsning
Standardisere datatypen ’datatime’
Har problemer med .net og mysql med mysql 'datatype'. Den virker til at være meget dynamisk. Er der en måde at standardisere den på, så den er ens på alle pc´ere lige meget opsætningen af disse?
Nu er det lidt svært at læse hvad du skriver, men handler det ikke og MySql og datatypen datetime?
At den er "dynamisk" hænger nok sammen med t datoformater er forskellige i forskellige lande, så afhængig af det miljø der er sat op vil tingene fungere forskelligt.
Hvis du altd bruger f. eks. engelsk windows, med dansk valgt som sprog i kontrolpanelet, og i det hele taget altid træffer de samme valg ved installation af software, optettelse af databaser, tabeller og kolonner, så vil det altid virke ens.
Mit råd er imidlertid at du altid koder tingene så de fungerer uanset miljøet. Det er ikke så let med datofelter, men det kan gøres.
Jeg arbejder selv på MSSQL, så jeg kan ikke hjælpe dig i detaljer. Men læs dokumentationen, søg på nettet og test altid grundigt, så vil du nok finde ud af det.
Typisk vil man opleve at man tror man skriver 5. april ind i databasen, men år man læser det bagefter står der 4. maj. Det bliver byttet om på dato og måned.
ja, det er mysql datatypen datetime det omhandler. Ligesom du anbefaler, er også måden jeg ønsker at gøre det på. "Mit råd er imidlertid at du altid koder tingene så de fungerer uanset miljøet. Det er ikke så let med datofelter, men det kan gøres." Har søgt men har ikke rigtig kunne finde noget :(
Som sagt har jeg ikke fantastisk meget forstand på MySql.
Men du skal dele tingene op, så de kan overskues:
1. scenario: Du skal læse en dato fra databasen, og vise den på en php-side. Kan du det uden problemer? Findes der i php nogle funktioner, så du kan gøre noget der ligner: echo Day($dtmDato) . "-" . Month($dtmDate) . "-" . Year($dtmDato) Mit bud er at dette er det letteste.
2. scenario: Du skal skrive en dato til MySql. Enten i en INSERT/UPDATE situation, eller i en SELECT .... WHERE. Du vil her skulle konvertere en dato til en tekststreng, og så brænder det på!
Mit spm: Har du en måde at fortælle MySql hvilket "sprog" (altså datoformat) du har tænkt dig at benytte? Evt i forbindelse med at du åbner din connection? ELLER kan du spørge MySql hvilket sprog den er indstillet til at benytte? Du skulle gerne ende med at skrive en funktion der laver en dato om til en tekststreng, og lægge den ét sted, så du altid bruger den samme funktion, indefor det samme projekt i det mindste.
Du skal styre det gennem applikationen (.NET). Nu er jeg ikke så meget inde i .NET, men du kan sikkert bestemme hvilken landkode (LCID) der skal bruges, og dermed formatet på datoer og tal. Du skal også sikre at alle datoer, som overføres til databasen, kommer ind på samme format. Brug her yyyy-mm-dd formatet. Det tager den ikke tage fejl af.
Nu er det godt nok asp.net jeg bruger, her bruger jeg bare strenge til at holde datoen. Men problemet er at den ikke er konstant, så jeg får sam fejl som du nævner "Typisk vil man opleve at man tror man skriver 5. april ind i databasen, men år man læser det bagefter står der 4. maj. Det bliver byttet om på dato og måned."
Netop. Så hvis du kan starte med at finde ud af hvilket format databasen bruger, så kan du lave en funktion, function DateToSqlString(@dtmInput), der benytter den viden, og derfor altid gør det korrekt. Hver gang du skal lave en SQL-string med en dato skal du så bruger den funktion.
Ja, men db´en ændre sig alt efter opsætningen på den pc den køre på... Er der ikke en komando til MySQL der sætter 'datetime' formatet? - Så den er ens uafhængigt af maskinens opsætning? ldanielsen: Som du nævner i dit sidst oplæg er også måden jeg har gjort det på... Men det nytter jo ikke noget så længe formatet skifter :(
Mit spm: Har du en måde at fortælle MySql hvilket "sprog" (altså datoformat) du har tænkt dig at benytte? Evt i forbindelse med at du åbner din connection? ELLER kan du spørge MySql hvilket sprog den er indstillet til at benytte?
Som sagt har jeg ikke svaret, men det er sådan jeg ville forsøge at løse det. Så kan du nemlig tillade dig at glemme problemet.
Jeg tror altså ikke det er et database problem.. Bruger du ikke .NET til at tilgå/indsætte alle informationer i databasen?? For så er det her du skal kode dig ud af problemet.
Nu er jeg ikke så meget inde i .NET, men hvis det var ASP, så ville jeg benytte ADO til at tilgå databasen, og hvis jeg så i mit miljø, VBScript, kan hælde datoen i en variabel af typen Date, så ville provideren eller driveren sørge for at det blev rigtigt. Noget tilsvarende gælder for .NET.
Men hvis du koder på den måde at du opbygger SQL-strenge, som tekst, så vil alle de nævnte problemer alligevel gælde. Hvis man sender tekst direkte til databasen, så er miljøet underordnet, så tager den det SQL den får for pålydende.
Der er MySQL, jeg kan ikke få ADO til at virke med MySQL :( Men du har ret det er oplagt, men sådan er det når man ikke bruger et produkt fra Microsoft. Fennec man kan ikke rigtig kode sig ud af problemet, når SQL syntaxen ændre sig, alt efter hvilken omsætning man køre. ldanielsen stiller de rigtige spørgsmål, i kommentaren fra 12.54
SELECT CONVERT(varchar(20), GetDate()) AS TestDato
Hvis du åbner den skulle du få en tekststreng der er MySql's bud på hvordan en dato skal laves. Ud fra det kan du måske snuse formatet, og derefter bruge den viden til at lave SQL'en rigtig.
Funktionerne CONVERT og GETDATE() er MSSQL, oversæt dem selv til MySql's tilsvarende.
fennec siger at yyyy-mm-dd altid bliver korrekt forstået, er det sandt? Og bemærk, at når du vurderer dette skal du først være 1000% sikker på at du har rigtig fat i at LÆSE datoerne fra databasen. Dette er under alle omstændigheder nummer et, og sikkert også det nemmest at løse (se mit indlæg 12:02).
ldanielsen >> Jeg har personligt aldrig oplevet problemer med yyyy-mm-dd formatet i MySQL, MS-SQL og Access, og jeg har ikke høre om problemer i andre databaser. Derfor bruger jeg altid det format når jeg indsætter/selecter. Og det fede er netop at den ikke vil godtage '2004-13-12' som en gyldig dato, modsat dd-mm-yyyy/mm-dd-yyyy problametikken, som vi er inde på her.
hunter1978 >> Jeg kunne godt tænke mig at vide hvordan du får "yyyy-mm-dd" til at fejle, så jeg selv kan være opmærksom på problemet. Det kan jo betyde at jeg skal have lavet en ændring i mine dato rutiner :(
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.