Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Formating πεδία Datetime

Îåêßíçóå áðü ôï ìÝëïò axaros. Τελευταία δημοσίευση από το μέλος axaros στις 02-08-2005, 21:14. Υπάρχουν 20 απαντήσεις.
Σελίδα 1 από 2 (21 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  23-05-2005, 12:44 2144

    Formating πεδία Datetime

    Γεια σας ανήσυχοι !!!!!

    Πως θα κάνω format ένα πεδίο datetime σε dd/MM/yyyy HH:mm:ss (24ωρο χωρίς ένδειξη AM ή PM);
    Πάνος Αβραμίδης
  •  23-05-2005, 13:00 2145 σε απάντηση της 2144

    Re: Formating πεδία Datetime

    Το format string είναι το σωστό. Μήπως εννοείς σε ποιό property πρέπει να το βάλεις?

    Το DateTimePicker έχει δύο properties για το format. Για να βάλεις το δικό σου, custom format βάζει το Format = Custom και το CustomFormat αυτό που έγραψες.

    Όλα όσα θες για τα controls και τα format θα τα βρεις πολυ πιο εύκολα αν κοιτάξεις πρώτα στο MSDN. Υπάρχουν τόσο οι περιγραφές για τα format strings όσο και για τα DateTimePicker και MonthCalendar
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  23-05-2005, 13:16 2146 σε απάντηση της 2145

    Re: Formating πεδία Datetime

    Γεια σου συνονόματε,
    θα ήθελα να γράψω ένα User defined function στον SQL server που να γυρνάει προφανώς string (nvarchar) στο παραπάνω format ...


    Πάνος Αβραμίδης
  •  23-05-2005, 13:37 2147 σε απάντηση της 2144

    Re: Formating πεδία Datetime

    Ιδού και το function που δεν μου παίζει :


    CREATE FUNCTION [dbo].[fnDateFormating] (
    @Date datetime)
    RETURNS nvarchar(50)

    AS
    BEGIN

    DECLARE @display nvarchar(50)

    IF @Date = Null
    BEGIN
    SET @display = 'Τώρα'
    END
    ELSE
    BEGIN
    --SET @display = Convert(varchar(50),@Date)
    SET @display = CAST(DATEPART(mm, @Date) AS nvarchar) + '/' + CAST(DATEPART(dd, @Date) AS nvarchar) + '/' + CAST(DATEPART(yyyy, @Date) AS nvarchar)  + ' ' +
      CAST(DATEPART(HH, @Date) AS nvarchar) + ':' + CAST(DATEPART(mm, @Date) AS nvarchar) + ':' + CAST(DATEPART(ss, @Date) AS nvarchar)

    END

    RETURN @display
    END


    Πάνος Αβραμίδης
  •  23-05-2005, 13:39 2148 σε απάντηση της 2146

    Re: Formating πεδία Datetime

    Καλά να πάθω που διαβάζω τα posts από το Google.

    PATRICK! ΠΟΤΕ ΕΠΙΤΕΛΟΥΣ ΘΑ ΜΠΕΙ ΑΥΤΟ ΤΟ LATEST POSTS?

    Λοιπόν, αυτό που ζητάς είναι μυστηριωδώς δύσκολο. Η T-SQL έχει ένα function, το CONVERT που μετατρέπει τιμές από τον ένα τύπο στον άλλο. Μπορείς να το χρησιμοποιήσεις αλλά υποστηρίζει μόνο συγκεκριμμένα formats. Αν γράψεις 
       select convert(nvarchar(30),getdate(),120)
    θα σου γυρίσει
       2005-05-23 13:35:42

    Η άλλη λύση είναι να φτιάξεις ένα function που θα χρησιμοποιεί την datepart για να πάρει κομμάτι-κομμάτι την ημερομηνία και να κολλήσει τα κομμάτια όπως τα θες. Πολύ σπαστικό και λέει να το κάνεις μόνο αν είναι ανάγκη.

    Είναι χίλιες φορές καλύτερο να κάνεις την μετατροπή στον client. Είτε μιλάμε για Windows Forms, Web Forms, VB6, Reporting Services, Crystal Reports, οποιοδήποτε client μπορεί να κάνει καλύτερα τη μετατροπή.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  23-05-2005, 13:51 2149 σε απάντηση της 2147

    Re: Formating πεδία Datetime

    Χίχιχι, δεν είμαι μόνο εγώ αφηρημένος! Ανακούφιση!

    Αν προσέξεις το cast, έχεις βάλει πρώτο τον μήνα και τον επαναλαμβάνεις αντί για τα λεπτά! Το σωστό cast είναι:

    SET @display =  CAST(DATEPART(dd, @Date) AS nvarchar) + '/' + CAST(DATEPART(mm, @Date) AS nvarchar) + '/' + CAST(DATEPART(yyyy, @Date) AS nvarchar)  + ' ' +
      CAST(DATEPART(HH, @Date) AS nvarchar) + ':' + CAST(DATEPART(mi, @Date) AS nvarchar) + ':' + CAST(DATEPART(ss, @Date) AS nvarchar)

    Τώρα αν καταλάβω και γιατί δεν βάζει μηδενικά στους μονοψήφιους αριθμούς ...


    Όπως έλεγα, καλύτερα να κάνεις τη μετατροπή στον client.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  23-05-2005, 14:33 2150 σε απάντηση της 2149

    Re: Formating πεδία Datetime

    Παναγιώτη,
    Έχεις απόλυτο δίκιο ...
    Είδες τι παθαίνω από το πολύ googling ....

    Αυτό το %#$ (τιμημένο) μονοψήφιο με έχει γονατίσει κι εμένα ...

    Θα μπορούσα να το κάνω στον όποιο client αλλά θέλω να εμφανίζω το string 'Τώρα' υπό το Null condition ...


    Πάνος Αβραμίδης
  •  23-05-2005, 14:51 2151 σε απάντηση της 2144

    Re: Formating πεδία Datetime

    ΕΥΡΗΚΑ !!!!!!!!!!!!!!!!!!!

    Πάνο θέλω τη γνώμη σου !!!!

    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_NULLS ON
    GO

    CREATE FUNCTION [dbo].[FormatDate] (
        @date datetime,
        @format varchar(100) = ''
    )
    RETURNS varchar(256)
    AS
    BEGIN

    /*
    Valid @format arguments
    nothing -  returns the date as varchar or a blank string if null
    y or yy - returns the last two digits of the year
    yyyy - returns the four digits of the year
    m  - returns the month
    mm  - returns the month zero filled forcing two digits
    d  - returns the day
    dd  - returns the day zero filled forcing two digits
    h  - returns the hour
    hh  - returns the hour zero filled forcing two digits
    n  - returns the minute
    nn  - returns the minute zero filled forcing two digits
    s  - returns the second
    ss  - returns the second zero filled forcing two digits
    l - returns millisecond
    else - returns itself
    */

    declare @fmtxt varchar(100)
    declare @frmtemp varchar(4)
    declare @fmchar varchar(1)
    declare @i int

    --Return blank if date is null
    if (@date = '' or @date is null) return ''

    --Return date as string if format is blank
    if (@format is null or @format='') return convert(varchar, @date)

    set @fmtxt = ''
    set @I = 1
    set @format = lower(@format) --in case the server is set to case sensitvity

    --loop through each format character
    while (@i < len(@format) + 1)
    begin
    set @fmchar = substring(@format, @i, 1)
    if (@fmchar = 'y')
    begin
      --see if next character is the same
      if (substring(@format, @i+3, 1) = @fmchar)
      begin
       set @fmtxt = @fmtxt + convert(varchar, datepart(yyyy, @date))
       set @i = @i + 3
      end
      else
      begin
       set @fmtxt = @fmtxt + right(convert(varchar, datepart(yyyy, @date)), 2)
       if (substring(@format, @i+1, 1) = @fmchar) set @i = @i + 1
      end
     
    end
    else if (@fmchar = 'm')
    begin
      --see if next character is the same
      if (substring(@format, @i+1, 1) = @fmchar)
      begin
       set @frmtemp = convert(varchar, datepart(m, @date))
       if (len(@frmtemp) = 1) set @frmtemp = '0' + @frmtemp
       set @fmtxt = @fmtxt + @frmtemp
       set @i = @i + 1
      end
      else
       set @fmtxt = @fmtxt + convert(varchar, datepart(m, @date))
    end
    else if (@fmchar = 'd')
    begin
      --see if next character is the same
      if (substring(@format, @i+1, 1) = @fmchar)
      begin
       set @frmtemp = convert(varchar, datepart(d, @date))
       if (len(@frmtemp) = 1) set @frmtemp = '0' + @frmtemp
       set @fmtxt = @fmtxt + @frmtemp
       set @i = @i + 1
      end
      else
       set @fmtxt = @fmtxt + convert(varchar, datepart(d, @date))
    end
    else if (@fmchar = 'h')
    begin
      --see if next character is the same
      if (substring(@format, @i+1, 1) = @fmchar)
      begin
       set @frmtemp = convert(varchar, datepart(hh, @date))
       if (len(@frmtemp) = 1) set @frmtemp = '0' + @frmtemp
       set @fmtxt = @fmtxt + @frmtemp
       set @i = @i + 1
      end
      else
       set @fmtxt = @fmtxt + convert(varchar, datepart(hh, @date))
    end
    else if (@fmchar = 's')
    begin
      --see if next character is the same
      if (substring(@format, @i+1, 1) = @fmchar)
      begin
       set @frmtemp = convert(varchar, datepart(s, @date))
       if (len(@frmtemp) = 1) set @frmtemp = '0' + @frmtemp
       set @fmtxt = @fmtxt + @frmtemp
       set @i = @i + 1
      end
      else
       set @fmtxt = @fmtxt + convert(varchar, datepart(s, @date))
    end
    else if (@fmchar = 'n')
    begin
      --see if next character is the same
      if (substring(@format, @i+1, 1) = @fmchar)
      begin
       set @frmtemp = convert(varchar, datepart(n, @date))
       if (len(@frmtemp) = 1) set @frmtemp = '0' + @frmtemp
       set @fmtxt = @fmtxt + @frmtemp
       set @i = @i + 1
      end
      else
       set @fmtxt = @fmtxt + convert(varchar, datepart(n, @date))
    end
    else if(@fmchar = 'l')
      set @fmtxt = @fmtxt + convert(varchar, datepart(ms, @date))
    else
      set @fmtxt = @fmtxt + @fmchar

    set @i = @i + 1
    end

    return  @fmtxt

    END
    GO

    GRANT EXEC on dbo.FormatDate to PUBLIC
    GO

    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO


    Πάνος Αβραμίδης
  •  23-05-2005, 15:25 2152 σε απάντηση της 2151

    Surprise [:O] Re: Formating πεδία Datetime

    excuse moi, αλλά δεν είναι λίγο θεοπάλαβο να υπάρχει στη βάση όλο αυτό το γαϊδούρι; Τις τιμές σου αν τις δείχνεις σε grid, μπορείς να ορίσεις τι θα δείχνει στη θέση του null από τα properties του datagrid column...
    Χρήστος Γεωργακόπουλος
  •  23-05-2005, 16:08 2153 σε απάντηση της 2144

    Re: Formating πεδία Datetime

    Je te pardon mon ami ....

    Το αν είναι θεοπάλαβο δεν το ξέρω, θα έχεις τους λόγους για να το λες ...
    Εγώ μιά εναλλακτική λύση ζητούσα για να μην κάνω formatting στον client ...


    Πάνος Αβραμίδης
  •  23-05-2005, 16:16 2154 σε απάντηση της 2153

    Re: Formating πεδία Datetime

    To TheotrelloGaidouraki τι σου λέει :

    CREATE FUNCTION ΤheotreloGaidouraki (@date as Datetime) 
    RETURNS  nvarchar(50)
    AS 
    BEGIN
    Declare @Result nvarchar(50)
    Declare @Days nvarchar(2)
    Declare @Months nvarchar(2)
    Declare @Hours nvarchar(2)
    Declare @Minutes nvarchar(2)
    Declare @Seconds nvarchar(2)

     If @Date = Null
      Begin
       Set @Result = 'Τώρα'
      end
     Else
      Begin
       If Len(CAST(DATEPART(dd, @Date) AS nvarchar)) = 1
        Begin
         Set @Days = '0' + CAST(DATEPART(dd, @Date) AS nvarchar)
        End
       Else
        Begin
         Set @Days =  CAST(DATEPART(dd, @Date) AS nvarchar)
        End 
       
       If Len(CAST(DATEPART(mm, @Date) AS nvarchar)) = 1
        Begin
         Set @Months = '0' + CAST(DATEPART(mm, @Date) AS nvarchar)
        End
       Else
        Begin
         Set @Months =  CAST(DATEPART(mm, @Date) AS nvarchar)
        End 

       If Len(CAST(DATEPART(HH, @Date) AS nvarchar)) = 1
        Begin
         Set @Hours = '0' + CAST(DATEPART(HH, @Date) AS nvarchar)
        End
       Else
        Begin
         Set @Hours =  CAST(DATEPART(HH, @Date) AS nvarchar)
        End

       If Len(CAST(DATEPART(mi, @Date) AS nvarchar)) = 1
        Begin
         Set @Minutes = '0' + CAST(DATEPART(mi, @Date) AS nvarchar)
        End
       Else
        Begin
         Set @Minutes =  CAST(DATEPART(mi, @Date) AS nvarchar)
        End
       
       If Len(CAST(DATEPART(ss, @Date) AS nvarchar)) = 1
        Begin
         Set @Seconds = '0' + CAST(DATEPART(ss, @Date) AS nvarchar)
        End
       Else
        Begin
         Set @Seconds =  CAST(DATEPART(ss, @Date) AS nvarchar)
        End

       Set @Result = @Days +'/' + @Months + '/' + CAST(DATEPART(yyyy, @Date) AS nvarchar)  + ' ' +
                      @Hours + ':' + @Minutes + ':' + @Seconds
      End

    Return @Result

    END

     


    Πάνος Αβραμίδης
  •  23-05-2005, 19:38 2160 σε απάντηση της 2154

    Re: Formating πεδία Datetime

    Νομίζω γίνεστε τραγικοί.. το CONVERT κάνει μια χαρά την δουλειά και δεν υπάρχει ανάγκη για ΟΤΙ παραπέρα. Πόσο μάλλον όταν υποστηρίζει σχεδόν κάθε επίσημο format ημερομηνίας που υπάρχει επάνω στον πλανήτη!

    Μέσα στο Books on Line και στην σελίδα του "CAST and CONVERT" υπάρχει ο αναλυτικός πίνακας με τις ημερομηνίες και τους κωδικούς που δέχεται το CONVERT για να γυρίσει το string που απαιτείται κάθε φορά.

    Σκοπός είναι να μένει κάτι απλό και να μπορεί να επαναχρησιμοποιηθεί εύκολα. Δεν είναι ανάγκη να ξαναγράφουμε ότι υπάρχει από την αρχή, για να το κάνουμε optimize στις ανάγκες μας. Τότε δεν θα γράφουμε προγράμματα, θα κάνουμε optimize κώδικα.

    Για την ιστορία πλέον:

    dd/mm/yy : Convert(varchar(32), DateColumn, 3)
    dd/mm/yyyy : Convert(varchar(32), DateColumn, 103)
    hh:mm:ss : Convert(varchar(32), DateColumn, 108)

    Και όταν δεν έχει κάτι που χρειαζόμαστε το φτιάχουμε με τα παραπάνω:
    dd/mm/yy hh:mm:ss
    : Convert(varchar(32), DateColumn, 3) + ' ' + Convert(varchar(32), DateColumn, 108)

    George J.




    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  23-05-2005, 21:29 2162 σε απάντηση της 2160

    Re: Formating πεδία Datetime

    Monsieur Capnias, σας βγάζω το καπέλο! Λύση απλή και αποτελεσματική!

    Η αλήθεια είναι ότι σκεφτόμουνα ότι δεν μπορεί κανείς να φτιάξει οποιοδήποτε format με απλό τρόπο στον SQL Server. Ευτυχώς, αυτή η περίπτωση δουλεύει. Άλλες όμως μπορεί να μην δουλεύουν.

    Όπως και να έχει, αν θέλει κανείς format, πρέπει να το κάνει στον client. Και από φιλοσοφικής άποψης επίσης. Διαφορετικά θα πρέπει να πειράζει την DB κάθε φορά που θέλει να αλλάξει το format. 


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  24-05-2005, 08:15 2172 σε απάντηση της 2144

    Yes [Y] Re: Formating πεδία Datetime

    Thank you δάσκαλε !!!
    Πάνος Αβραμίδης
  •  27-05-2005, 07:27 2250 σε απάντηση της 2144

    Re: Formating πεδία Datetime

    ΚΑΙ ΜΙΑ ΠΑΡΑΛΛΑΓΗ:



    CREATE FUNCTION fxFormatDate( @value as datetime, @forma as smallint ) RETURNS varchar(20)
    AS BEGIN
    Declare @dd as varchar(2)
    Declare @mm as varchar(2)
    Declare @yy as varchar(2)
    Declare @yyyy as varchar(4)
     
     Set @dd = dbo.fxPadL(datepart(day,@value),2,'0')
     Set @mm = dbo.fxPadL(datepart(month,@value),2,'0')
     Set @yy = Right(datepart(year,@value),2)
     Set @yyyy =  dbo.fxPadL(datepart(year,@value),4,'0')

     IF @forma = 1 Return @dd + '/' + @mm + '/' + @yyyy
     IF @forma = 2 Return @dd + '/' + @mm + '/' + @yy
     IF @forma = 3 Return @dd + '/' + @mm

     IF @forma = 4 Return @dd + @mm + @yyyy
     IF @forma = 5 Return @dd + @mm + @yy
     IF @forma = 6 Return @dd + @mm

     IF @forma = 7 Return @yyyy + @mm + @dd
     IF @forma = 8 Return @yy + @mm + @dd
     IF @forma = 9 Return @mm + @dd

     RETURN ''
    END


    CREATE FUNCTION fxPadL( @str as varchar(255), @Length int, @chr as varchar(1)) RETURNS varchar(255)
    As Begin
     RETURN Replicate( @chr, @Length-Len(@str) ) + @str
    End


    CREATE FUNCTION fxPadR( @str as varchar(255), @Length int, @chr as varchar(1)) RETURNS varchar(255)
    AS BEGIN
     RETURN @str + Replicate( @chr, @Length-Len(@str) )
    END


     


    while (!dead) learn();
Σελίδα 1 από 2 (21 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems