Avatar billede sbjerre Nybegynder
25. september 2002 - 23:44 Der er 5 kommentarer og
1 løsning

Forkert datoformat efter udtræk fra SQL server

Ok here it goes:

Jeg har en tabel i en database (SQL server) der bl.a. indeholder to tidspunkter starttid og sluttid, begge af typen datetime, som typisk indeholder en værdi ala 10.00.00 (for eks. klokken 10)

Når jeg udtrækker data fra denne tabel og fremviser dem via et datagrid får tidspunkterne nu formatet
30-12-1899 10.00.00 dvs. hvor en dato (30. december 1899) forekommer på alle tidspunkterne.

Så er spørgsmålet:
Kan man nøjes med at få vist datoen i formatet 10.00 (dvs. kun tiden UDEN sekunder og ISÆR UDEN datoen 30-12-1899) ??
Kan man TypeCast'e ligesom i Java således at man tvinger datotypen til at blive en shortTimeString eller noget lignende

Skriv endelig hvis spørgsmålet skal uddybes...

Koden ser ud som følger:

OleDbConnection Conn = new OleDbConnection("Provider=SQLOLEDB;Data Source=localhost;uid=dbtest;Initial Catalog=booking");
OleDbCommand myCommandReservationer = new OleDbCommand(strSQL, Conn);
OleDbDataAdapter myDataAdapterReservationer = new OleDbDataAdapter(myCommandReservationer);

Conn.Open();

// Bind data from tblModer til DataGrid
DataSet myDataSetReservationer = new DataSet();
myDataAdapterReservationer.Fill(myDataSetReservationer, "tblModer");
DataGrid.DataSource = myDataSetReservationer.Tables["tblModer"].DefaultView;
DataGrid.DataBind();

Conn.Close();

Vh Søren
Avatar billede askhoej Praktikant
26. september 2002 - 14:01 #1
Opret følgende funktion på din SQL server:

CREATE FUNCTION [dbo].[FormatDate] (@Date datetime, @Format varchar(256))
RETURNS varchar(256)
AS 
BEGIN

    IF @Date IS NULL RETURN('')

/*
    d    The one-digit of the two-digit day.
    dd    The two-digit day.  Single-digit day values are preceded by a zero.
    ddd    The three-character weekday abbreviation.
    dddd    The full weekday name.
    h    The one-digit or the two-digit hour in 12-hour format.
    hh    The two-digit hour in 12-hour format.  Single-digit values are preceded
        by a zero.
    HHH     The one-digit or the two-digit hour in 24-hour format.
    HHHH     The two-digit hour in 24-hour format. Single-digit values are preceded
        by a zero.
    n     The one-digit or the two-digit minute.
    nn     The two-digit minute. Single-digit values are preceded by a zero.
    M     The one-digit or the two-digit month number.
    MM     The two-digit month number. Single-digit values are preceded by a zero.
    MMM     The three-character month abbreviation.
    MMMM     The full month name.
    t     The one-letter A.M. and P.M. abbreviation (that is, “AM” is displayed as “A”).
    tt     The two-letter A.M. and P.M. abbreviation (that is, “AM” is displayed as “AM”).
    y     The year is displayed as the last two digits, but with no leading zero for any
        year that is less than 10.
    yy     The last two digits of the year. For example, 1998 would be displayed as
        “98”.
    yyy     The full year. For example, 1998 would be displayed as “1998”.
   
*/

    DECLARE @d varchar(2)    -- day
    DECLARE @dd char(2)
    DECLARE @ddd char(3)
    DECLARE @dddd varchar(10)

    DECLARE @hour int
    DECLARE @h varchar(2)    -- 12 hour
    DECLARE @hh char(2)

    DECLARE @HHH varchar(2)    -- 24 hour
    DECLARE @HHHH char(2)

    DECLARE @n varchar(2)    -- minutes
    DECLARE @nn char(2)

    DECLARE @M varchar(2)    -- month
    DECLARE @MM varchar(2)
    DECLARE @MMM varchar(3)
    DECLARE @MMMM varchar(10)

    DECLARE @t char(1)        -- am/pm
    DECLARE @tt char(2)

    DECLARE @y varchar(2)    -- year
    DECLARE @yy char(2)
    DECLARE @yyy char(4)
    DECLARE @year int

    -- Retrieve values
    SET @d = CAST(DATEPART(d, @Date) AS VARCHAR(2))
    SET @dd = RIGHT('0' + @d, 2)
    SET @dddd = DATENAME(dw, @Date)
    SET @ddd = LEFT(@dddd, 3)

    SET @Hour = DATEPART(hh, @Date)
    SET @HHH = CAST(@Hour AS VARCHAR(2))
    SET @HHHH = RIGHT('0' + @HHH, 2)

    IF @Hour < 12 SET @tt = 'AM' ELSE SET @tt = 'PM'
    SET @t = LEFT(@tt, 1)
    IF @Hour > 12 SET @h = CAST(@Hour - 12 AS VARCHAR(2)) ELSE SET @h = CAST(@Hour AS VARCHAR(2))
    IF @Hour = 0 OR @Hour = 12 SET @h = '12'
    SET @hh = RIGHT('0' + @h, 2)
   
    SET @n = CAST(DATEPART(n, @Date) AS VARCHAR(2))
    SET @nn = RIGHT('0' + @n, 2)

    SET @M = CAST(DATEPART(m, @Date) AS VARCHAR(2))
    SET @MM = RIGHT('0' + @M, 2)
    SET @MMMM = DATENAME(m, @Date)
    SET @MMM = LEFT(@MMMM, 3)

    SET @year = DATEPART(yyyy, @Date)
    SET @y = RIGHT(CAST(@year AS VARCHAR(4)), 2)
    SET @yy = RIGHT('0' + CAST(@year AS VARCHAR(4)), 2)
    SET @yyy = RIGHT('000' + CAST(@year AS VARCHAR(4)), 4)

    -- Parse format
    SET @Format = REPLACE(@Format, 'dddd', '\\\\1\\\\')
    SET @Format = REPLACE(@Format, 'ddd', '\\\\2\\\\')
    SET @Format = REPLACE(@Format, 'dd', '\\\\3\\\\')
    SET @Format = REPLACE(@Format, 'd', '\\\\4\\\\')
    SET @Format = REPLACE(@Format, 'hhhh', '\\\\5\\\\')
    SET @Format = REPLACE(@Format, 'hhh', '\\\\6\\\\')
    SET @Format = REPLACE(@Format, 'hh', '\\\\7\\\\')
    SET @Format = REPLACE(@Format, 'h', '\\\\8\\\\')
    SET @Format = REPLACE(@Format, 'nn', '\\\\9\\\\')
    SET @Format = REPLACE(@Format, 'n', '\\\\10\\\\')
    SET @Format = REPLACE(@Format, 'mmmm', '\\\\11\\\\')
    SET @Format = REPLACE(@Format, 'mmm', '\\\\12\\\\')
    SET @Format = REPLACE(@Format, 'mm', '\\\\13\\\\')
    SET @Format = REPLACE(@Format, 'm', '\\\\14\\\\')
    SET @Format = REPLACE(@Format, 'tt', '\\\\15\\\\')
    SET @Format = REPLACE(@Format, 't', '\\\\16\\\\')
    SET @Format = REPLACE(@Format, 'yyy', '\\\\17\\\\')
    SET @Format = REPLACE(@Format, 'yy', '\\\\18\\\\')
    SET @Format = REPLACE(@Format, 'y', '\\\\19\\\\')

    -- Populate with values
    SET @Format = REPLACE(@Format, '\\\\1\\\\', @dddd)
    SET @Format = REPLACE(@Format, '\\\\2\\\\', @ddd)
    SET @Format = REPLACE(@Format, '\\\\3\\\\', @dd)
    SET @Format = REPLACE(@Format, '\\\\4\\\\', @d)
    SET @Format = REPLACE(@Format, '\\\\5\\\\', @hhhh)
    SET @Format = REPLACE(@Format, '\\\\6\\\\', @hhh)
    SET @Format = REPLACE(@Format, '\\\\7\\\\', @hh)
    SET @Format = REPLACE(@Format, '\\\\8\\\\', @h)
    SET @Format = REPLACE(@Format, '\\\\9\\\\', @nn)
    SET @Format = REPLACE(@Format, '\\\\10\\\\', @n)
    SET @Format = REPLACE(@Format, '\\\\11\\\\', @mmmm)
    SET @Format = REPLACE(@Format, '\\\\12\\\\', @mmm)
    SET @Format = REPLACE(@Format, '\\\\13\\\\', @mm)
    SET @Format = REPLACE(@Format, '\\\\14\\\\', @m)
    SET @Format = REPLACE(@Format, '\\\\15\\\\', @tt)
    SET @Format = REPLACE(@Format, '\\\\16\\\\', @t)
    SET @Format = REPLACE(@Format, '\\\\17\\\\', @yyy)
    SET @Format = REPLACE(@Format, '\\\\18\\\\', @yy)
    SET @Format = REPLACE(@Format, '\\\\19\\\\', @y)

    return(@Format)

END

Og herefter kan du bruge den sådan her:

SELECT dbo.FormatDate(dato_kolonne,'hhh.nn') FROM tabel

/askhoej
Avatar billede sbjerre Nybegynder
26. september 2002 - 16:06 #2
den kunne du lige i hovedet he he....
jeg tester den lige senere og hvis den virker er pointene helt klart dine...
Avatar billede sbjerre Nybegynder
26. september 2002 - 17:41 #3
Den virker i fint i det SQL udtræk jeg henviste til herover, men et andet sted i programmet tager jeg de enkelte felter og bruger dem som labeltekster som vist herunder:

LabelStarttid.Text = myDataSetReservation.Tables["tblModer"].Rows[0]["Starttid"].ToString();

der smider den en fejl når jeg prøver at indsætte starttid som tekststreng...

************************* FEJL ******************************

Column 'Starttid' does not belong to table tblModer.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentException: Column 'Starttid' does not belong to table tblModer.

Source Error:


Line 110:            LabelMoedeans.Text = myDataSetReservation.Tables["tblModer"].Rows[0]["Moedeansvar"].ToString();
Line 111:            LabelDato.Text = myDataSetReservation.Tables["tblModer"].Rows[0]["Dato"].ToString();
Line 112:            LabelStarttid.Text = myDataSetReservation.Tables["tblModer"].Rows[0]["Starttid"].ToString();
Line 113:            LabelSluttid.Text = myDataSetReservation.Tables["tblModer"].Rows[0]["Sluttid"].ToString();
Line 114:            LabelMoedevedr.Text = myDataSetReservation.Tables["tblModer"].Rows[0]["Aktivitet"].ToString();


Source File: c:\inetpub\wwwroot\lokalereservation\bookinginfo.aspx.cs    Line: 112

**************************** fejl slut *********************************

Det er samme fejl man får hvis man glemmer at udtrække det element i tabellen, som man prøver at indsætte som tekststreng. (Dvs. hvis jeg havde udeladt feltet 'Starttid' i min selectsætning)

Har du nogen forklaringer på dette, for jeg kan ikke greje den...

vh Søren
Avatar billede askhoej Praktikant
26. september 2002 - 22:37 #4
prøv at navngive dine kolonner i din sql forespørgsel og brug de navne i din kode eks:

SELECT dbo.FormatDate(dato_kolonne,'hhh.nn') as starttid FROM tabel

så burde du kunne bruge den sådan her:

LabelStarttid.Text = myDataSetReservation.Tables["tblModer"].Rows[0]["Starttid"].ToString();

Håber det virker :-)

/askhoej
Avatar billede sbjerre Nybegynder
27. september 2002 - 09:49 #5
Simpelthen....

Det funger jo som det skal !

Tusind tak for hjælpen
Du får lige point for følgende spørgsmål også - håber det er iorden :o)

http://www.eksperten.dk/spm/262980

/Søren
Avatar billede askhoej Praktikant
27. september 2002 - 09:59 #6
Det var så lidt, skulle det være en anden gang :-)

/askhoej
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