Avatar billede hunter1978 Nybegynder
13. december 2004 - 10:51 Der 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?
Avatar billede ldanielsen Nybegynder
13. december 2004 - 11:03 #1
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.
Avatar billede ldanielsen Nybegynder
13. december 2004 - 11:05 #2
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.
Avatar billede hunter1978 Nybegynder
13. december 2004 - 11:06 #3
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 :(
Avatar billede ldanielsen Nybegynder
13. december 2004 - 12:02 #4
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.
Avatar billede fennec Nybegynder
13. december 2004 - 12:06 #5
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.
Avatar billede hunter1978 Nybegynder
13. december 2004 - 12:06 #6
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."
Avatar billede ldanielsen Nybegynder
13. december 2004 - 12:13 #7
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.
Avatar billede hunter1978 Nybegynder
13. december 2004 - 12:40 #8
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 :(
Avatar billede ldanielsen Nybegynder
13. december 2004 - 12:54 #9
Præcis der er problemet

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.
Avatar billede fennec Nybegynder
13. december 2004 - 13:07 #10
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.
Avatar billede ldanielsen Nybegynder
13. december 2004 - 13:57 #11
Først: Det ER MySql, ikke MSSQL, ikke?

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.
Avatar billede hunter1978 Nybegynder
13. december 2004 - 14:20 #12
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
Avatar billede ldanielsen Nybegynder
13. december 2004 - 15:39 #13
Jeg har en lille idé:

Hvis vi nu starter med at lave en test:

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).
Avatar billede fennec Nybegynder
13. december 2004 - 15:55 #14
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.
Avatar billede hunter1978 Nybegynder
13. december 2004 - 22:42 #15
Fennec den er ikke 100 sikker desværre :(
Avatar billede arne_v Ekspert
13. december 2004 - 23:06 #16
Du skal ikke formatere den dato til en tekst streng.

Brug parameters og sæt parameter til en DateTime !
Avatar billede arne_v Ekspert
13. december 2004 - 23:26 #17
Eksempel:

using System;
using System.Threading;
using ByteFX.Data.MySqlClient;

namespace E3
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            MySqlConnection con = new MySqlConnection("Database=Test;Data Source=localhost;User Id=;Password=");
            con.Open();
            MySqlCommand cre = new MySqlCommand("CREATE TABLE dtest (i INTEGER PRIMARY KEY, d DATETIME)", con);
            cre.ExecuteNonQuery();
            MySqlCommand ins = new MySqlCommand("INSERT INTO dtest VALUES (@i, @d)", con);
            ins.Parameters.Add("@i", MySqlDbType.Int);
            ins.Parameters.Add("@d", MySqlDbType.Datetime);
            for(int i = 0; i < 10; i++)
            {
                ins.Parameters["@i"].Value = i;
                ins.Parameters["@d"].Value = DateTime.Now;
                Thread.Sleep(1000);
                ins.ExecuteNonQuery();
            }
            MySqlCommand sel = new MySqlCommand("SELECT * FROM dtest", con);
            MySqlDataReader rdr = sel.ExecuteReader();
            while(rdr.Read())
            {
                int i = (int)rdr[0];
                DateTime d = (DateTime)rdr[1];
                Console.WriteLine(i + " " + d);
            }
            rdr.Close();
            MySqlCommand drp = new MySqlCommand("DROP TABLE dtest", con);
            drp.ExecuteNonQuery();
            con.Close();
        }
    }
}
Avatar billede fennec Nybegynder
14. december 2004 - 08:23 #18
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 :(
Avatar billede hunter1978 Nybegynder
14. december 2004 - 15:51 #19
fennec: Nogle gange får jeg værdien 0000-00-00 sat ind, selvom det er et gyldigt udtryk jeg bruger.
Avatar billede fennec Nybegynder
14. december 2004 - 15:54 #20
Har du et eks på en dato du har bruge der...
Avatar billede ldanielsen Nybegynder
14. december 2004 - 16:08 #21
Du kan vel ikke sætte 0000-00-00 ind, den er da mildest talt ugyldig?
Avatar billede hunter1978 Nybegynder
23. juni 2005 - 09:24 #22
Lukker og slukker
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