Avatar billede thomas_n Nybegynder
25. august 2009 - 14:14 Der er 9 kommentarer

Skriv tidspunkt i SQL Server uden 01-01-1900

Hej,

Jeg forsøger at skrive eksempelvis '00:00:35' i min SQL Server tabel via en INSERT Command i VB.Net.

Selv oprettelsen går fint nok, men formatet i tabellen ser sådan her ud: 01-01-1900 00:00:35

jeg vil gerne have at formatet bliver bibeholdt, altså at der kun bliver skrevet 00:00:35 i tabellen.

Feltet i databasen er af typen Datetime.

Nogen der har løsningen på dette?

V.h.
Thomas
Avatar billede aaberg Nybegynder
25. august 2009 - 14:35 #1
Hej,

Her kommer en lille lektion i datetime datatypen.

Har du en kolonne i en database som er af type datetime, bliver data ikke skrevet til en kolonne i et bestemt format. En datetime kolonne indeholder dato og tid, og intet andet, den indeholder ingen information om, hvordan det skal formateres. Ellers ville der jo ikke være nogen forskel på en datetime kolonne og en varchar kolonne!

Når du selecter data fra en tabel med en datetime kolonne, vil applikationen du bruger, formatere indeholdet af kolonnen, så du kan forstå indholdet. SQL Serveren gemmer datetime data i et binært format der ikke er menneskeligt læsbart. Det er altså SQL Server Management Studio der formatere din datetime, når du kører en query.

Helt generelt for brug af datetime: Ikke spekulere så meget på formatet du ser i databasen, det er ikke vigtigt, og har intet at sige om, hvordan dit program viser dato og tid.

Dette er meget vigtigt: Når skriver til databasen fra et .NET program, skal du bruge parametre i din query. Hvis du gør dette, får du aldrig problemer med datetime formater.
Læs om SqlParameter klassen her:
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspx

Hvis du stadig er i tvivl om noget, så bare spørg.
Avatar billede arne_v Ekspert
25. august 2009 - 15:13 #2
Hvis du er paa en nyere SQLServer saa bruge felt typen TIME i.s.f. DATETIME.
Avatar billede thomas_n Nybegynder
25. august 2009 - 15:17 #3
Hmm, er det muligt du give et eksempel med udgangspunkt i nedenstående?

Dim cmd As SqlCommand = New SqlCommand("INSERT INTO Opkald(Dato, Samtaletid) VALUES('" & sNyDato & "','" & tcpData(1) & "')", con)

Det er samtaletid jeg gerne vil have formateret korrekt.

V.h.
Thomas
Avatar billede thomas_n Nybegynder
25. august 2009 - 23:52 #4
Så har jeg prøvet mig lidt frem, men render stadig ind i problemer.

Det skal lige siges at det er en SQL Server 2000 jeg arbejder med.

Dim cmd As SqlCommand = New SqlCommand("INSERT INTO Opkald(Dato,
Samtaletid) VALUES('" & sNyDato & "',@Samtaletid")", con)

Dim Samtaletid As SqlParameter
Samtaletid = New SqlParameter("@Samtaletid", SqlDbType.VarChar)
Samtaletid.Value = "00:00:35"
cmd.Parameters.Add(Samtaletid)

cmd.ExecuteNonQuery()

Alt efter hvilken datatype jeg vælger i SqlDbType får jeg forskellige resultater.

Ved datatypen VarChar skrives: 01-01-1900 00:00:35

Ved datatypen Time: {"Den anvendte version af SQL Server understøtter ikke datatypen 'time'."}

Ved datatypen DateTime skrives: 25-08-2009 00:00:35

Kan I hjælpe?
Avatar billede arne_v Ekspert
26. august 2009 - 00:06 #5
SqlDbType.DateTime er korrekt (fordi 2000 vistnok ikke har TIME).

Saet Valkue til et .NET DateTime objekt med 1. januar aar 1 som dato.

Vis vaerdierne formateret eksplicit til hh:mm:ss naar de skal vises.
Avatar billede thomas_n Nybegynder
26. august 2009 - 10:03 #6
Jeg synes det underligt at det skal være så nørklet. Jeg har lavet samme applikation i VB6 hvor jeg brugte ADO komponenten og her virkede det upåklageligt.

Nok om det, det er jo fagre nye tider :)
nu har jeg lagt databasen over på en SQL Server 2005, men kan ikke få datatypen Time til at virke i applikationen. Jeg får samme meddelelse som tidligere:  {"Den anvendte version af SQL Server understøtter ikke datatypen 'time'."}

Jeg kan heller ikke finde datatypen Time når jeg opretter tabellen i min SQL Server 2005. Skal man op i en 2008 udgave?
Avatar billede aaberg Nybegynder
26. august 2009 - 11:33 #7
Datatyperne Time og Date findes kun i 2008 versionen. Men jeg forstår stadig ikke hvad dit problem er?

Hvis du gemmer dine tidspunkter i en datetime i databasen, kan det vel være ligegyldigt om SQL Serveren sætter datoen til 1-1-1900! Du vælger jo selv hvordan du formaterer det i din applikation! Du kan bare ignorere datoen!

Derudover. Om du gemmer en datetime varibel fra en VB6 app eller en .NET app gør ingen forskel på, hvordan dataene bliver gemt.
Avatar billede thomas_n Nybegynder
26. august 2009 - 12:00 #8
Til info. I VB6 vil nedenstående kode skrive "00:00:35" i DB feltet samtaletid, som er af typen DateTime
With Adodc1.Recordset
  .AddNew
    !Dato = sNyDato
    !samtaletid = "00:00:35"
  .Update
End With

Men jeg har fattet et vink med en vognstang ;) jeg tager mig af det i min applikation.

Tak for hjælpen med at sætte mig på sporet.

Sender I begge et svar.
Avatar billede aaberg Nybegynder
26. august 2009 - 13:03 #9
Ok, måske jeg tager fejl på den måde tallene bliver gemt.

Du kan prøve at gemme tidspunktet i en TimeSpan i VB.NET, og sende den til databasen. Jeg ved ikke om det vil virke eller gøre en forskel, men det er et forsøg vært.
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
Kurser inden for grundlæggende programmering

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