Avatar billede pablopablo Nybegynder
28. februar 2005 - 21:28 Der er 11 kommentarer og
1 løsning

Hjælp til DateTime og SQL

Hejsa...

Jeg har en winform, som benytter CultureInfo og resx filer idet formen kan køre i mnage forskellige sprog...

Når brugeren benytter programmet gemmes bla. datoen i databasen...brugeren kan senere søge i de eksisterende poster...

og det er så her, at mit spg. kommer...hvordan laver jeg et sql statement som er i stand til at søge imellem to dato'er, ligegyldigt hvilket sprog programmet benytter...formatet ændrer sig jo også i databasen når brugeren gemmer data i databasen...

Lige nu kan jeg faktisk ikke engang få det til at virke, trods det kun køre ét sprog...har prøvet med følgende :

DateTime fraDatoOgTid = dateTimePickerSøgFraDato.Value.Date;
                DateTime tilDatoOgTid = dateTimePickerSøgTilDato.Value.Date;

                string fraDatoOgTidString = fraDatoOgTid.Date.ToString();
                string tilDatoOgTidString = tilDatoOgTid.Date.ToString();

whereDel += "NormalDatoOgKl >= #" + fraDatoOgTidString +"#";
whereDel += " AND NormalDatoOgKl <= #" + tilDatoOgTidString +"#";

når koden køres, kommer sql'en fx. til at se sådan her ud :

"NormalDatoOgKl >= #01-02-2005 00:00:00# AND NormalDatoOgKl <= #28-02-2005 00:00:00#"

der returnere underligt nok poster også fra Januar, samt KUN nogle få poster af de eksisterende poster fra Febuar...??

Håber meget i kan hjælpe mig

Mvh. PabloPablo
Avatar billede arne_v Ekspert
28. februar 2005 - 21:32 #1
Brug felt typen DATETIME i databasen.

Brug type DateTime i programmet.

Brug parameters i dine SQL sætninger.

Så bør du undgå den slags problemer.
Avatar billede pablopablo Nybegynder
28. februar 2005 - 21:33 #2
det gør jeg allerede...?-(
Avatar billede pablopablo Nybegynder
28. februar 2005 - 21:35 #3
min access er godt nok på dansk, men den står da på : "Dato og klokkeslæt"...
Avatar billede arne_v Ekspert
28. februar 2005 - 21:43 #4
Den SQL du viser ovenfor bruger ihvertfald ikke parameters
Avatar billede pablopablo Nybegynder
28. februar 2005 - 21:51 #5
ooh, jeg troede du mente når jeg skrev til databasen...hvordan skal jeg bruge parametres ved SELECT...? vil formatet ikke altid også bliver ændret / være afhængig af sproget, idet jeg jo både bruger CurrentCulture og CurrentUICulture, inden det bliver skrevet til databasen...?
Avatar billede arne_v Ekspert
28. februar 2005 - 23:22 #6
Nej.

DATETIME gemmes i databasen som en binær tid.

Og hvis du bruger parameters behøver du ikke tænke på om det nu er ddmmyyyy eller
mmddyyyy eller yyyymmdd.

Fordi så opererer du også på binær tid i dit program.
Avatar billede arne_v Ekspert
28. februar 2005 - 23:22 #7
using System;
using System.Threading;
using System.Data.OleDb;

class MainClass
{
    public static void Main(string[] args)
    {
        OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb");
        con.Open();
        OleDbCommand cre = new OleDbCommand("CREATE TABLE dtest (i INTEGER PRIMARY KEY, d DATETIME)", con);
        cre.ExecuteNonQuery();
        OleDbCommand ins = new OleDbCommand("INSERT INTO dtest VALUES (?, ?)", con);
        ins.Parameters.Add("@i", OleDbType.Integer);
        ins.Parameters.Add("@d", OleDbType.Date);
        for(int i = 0; i < 10; i++)
        {
            ins.Parameters["@i"].Value = i;
            ins.Parameters["@d"].Value = DateTime.Now;
            ins.ExecuteNonQuery();
            Thread.Sleep(1000);
        }
        Console.WriteLine("All rows :");
        OleDbCommand sel = new OleDbCommand("SELECT * FROM dtest", con);
        OleDbDataReader rdr = sel.ExecuteReader();
        while(rdr.Read())
        {
            int i = (int)rdr[0];
            DateTime d = (DateTime)rdr[1];
            Console.WriteLine(i + " " + d);
        }
        rdr.Close();
        Console.WriteLine("Rows last 5 seconds since " + DateTime.Now + " :");
        OleDbCommand sel2 = new OleDbCommand("SELECT * FROM dtest WHERE d > ?", con);
        sel2.Parameters.Add("@d", OleDbType.Date);
        sel2.Parameters["@d"].Value = DateTime.Now.AddSeconds(-5);
        OleDbDataReader rdr2 = sel2.ExecuteReader();
        while(rdr2.Read())
        {
            int i = (int)rdr2[0];
            DateTime d = (DateTime)rdr2[1];
            Console.WriteLine(i + " " + d);
        }
        rdr2.Close();
        OleDbCommand drp = new OleDbCommand("DROP TABLE dtest", con);
        drp.ExecuteNonQuery();
        con.Close();
    }
}
Avatar billede arne_v Ekspert
28. februar 2005 - 23:22 #8
All rows :
0 28-02-2005 23:20:24
1 28-02-2005 23:20:25
2 28-02-2005 23:20:26
3 28-02-2005 23:20:27
4 28-02-2005 23:20:28
5 28-02-2005 23:20:29
6 28-02-2005 23:20:30
7 28-02-2005 23:20:31
8 28-02-2005 23:20:32
9 28-02-2005 23:20:33
Rows last 5 seconds since 28-02-2005 23:20:34 :
6 28-02-2005 23:20:30
7 28-02-2005 23:20:31
8 28-02-2005 23:20:32
9 28-02-2005 23:20:33
Avatar billede arne_v Ekspert
28. februar 2005 - 23:23 #9
Eksemplet er banalt. Men det viser både INSERT og SELECT med parameters. Bemærk
at der er ike skyggen af nogen formatering af tid som tekst.
Avatar billede Syska Mester
07. marts 2005 - 14:36 #10
svar nok til dig fra arne?
Avatar billede arne_v Ekspert
07. marts 2005 - 14:48 #11
det burde der være
Avatar billede pablopablo Nybegynder
23. marts 2005 - 01:52 #12
sorry, jeg har været lidt langsom i denne tråd, ja løsningen var meget fin
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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