Visualizzazione dei risultati da 1 a 9 su 9

Hybrid View

  1. #1

    [SQL SERVER 2008] Conversione di INT in time

    Ciao a tutti,

    avrei bisogno di una dritta per convertire un campo integer in time:

    il campo presenta valori come questi:

    100 che sta per 00:01:00
    900 che sta per 00:09:00
    112300 che sta per 11:23:00

    e così via.

    come posso fare per ricomporre il formato time?

    Avevo pensato di trasformare tutto in varchar aggiungendo gli zeri mancanti e separare poi i numeri con i : ma mi sono un po' perso.

    IncorrectSyntax

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    prova a prendere spunto da sotto,
    puoi evitare di passare attraverso il varchar

    codice:
    USE tempdb;
    GO
    -- ********************************************************************
    
    declare @iii as int
    set @iii = 110
    print @iii
    
    -- *******************************************************************
    -- facciamolo direttamente con 1 solo passaggio
    -- convertiamo int in time
    
    declare @tt1 as time
    set @tt1 = format(@iii, '00:00:00')
    print @tt1
    
    -- *******************************************************************
    -- Oppure la alternativa con 2 passaggi
    -- convertiamo int in varchar  e poi varchar in time
    
    declare @vvv as varchar(8)
    set @vvv = format(@iii, '00:00:00')
    print @vvv 
    
    declare @tt2 as time
    set @tt2 = @vvv
    print @tt2
    
    -- *****************************************************************
    -- Finito
    



    Facci sapere
    Ultima modifica di nman; 16-03-2016 a 12:18

  3. #3
    Quote Originariamente inviata da nman Visualizza il messaggio
    prova a prendere spunto da sotto,
    puoi evitare di passare attraverso il varchar

    [code]
    USE tempdb;
    GO
    -- ************************************************** ******************

    declare @iii as int
    set @iii = 110
    print @iii

    -- ************************************************** *****************
    -- facciamolo direttamente con 1 solo passaggio
    -- convertiamo int in time

    declare @tt1 as time
    set @tt1 = format(@iii, '00:00:00')
    print @tt1

    -- ************************************************** *****************
    -- Oppure la alternativa con 2 passaggi
    -- convertiamo int in varchar e poi varchar in time

    declare @vvv as varchar(8)
    set @vvv = format(@iii, '00:00:00')
    print @vvv

    declare @tt2 as time
    set @tt2 = @vvv
    print @tt2

    -- ************************************************** ***************
    -- Finito



    Facci sapere
    Ti ringrazio per la risposta ma non riesco ad applicare la tua soluzione alla select inserita sotto; mi viene passato un errore sul comando format che non viene riconosciuto.

    Ecco la select (il campo ora è quello espresso con integer):


    codice:
    select                 T.azienda
    ,                        T.matr
    ,                        D.cognome
    ,                        D.nome
    ,                        ora
    ,                        verso
    ,                        T.tipo
    ,                        T.term 
    ,                        term.descr
    
    from                   E_P..tim T
        join                E_P..dip        D
            on             T.matr = D.matr
                and        T.azi = D.azi
        join                E_P..term
            on             t.terminale = term.terminale
    
    where                    T.tipo ='A' 
            and                T.azi in ('0000000001','0000000002')
            and                data between getdate ()-8 and getdate ()-1
    
    order by                data,ora
    Ultima modifica di IncorrectSintax; 16-03-2016 a 16:22
    IncorrectSyntax

  4. #4
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Mhhhh!!!! abbastanza complicato .........
    La verita è che quella vista non la capisco
    (certamente per ignoranza mia)
    hai queste 3 tabelle (con 2 punti dentro nel nel nome ?????)
    - E_P..tim (con allias T)
    - E_P..dip (con allias D)
    - E_P..term (con allias term)
    poi ci sono altri campi che non si capisce da quale tabella arrivino ......




    Se invece ti interessa brutalmente solo
    la conversione di quel campo integer in campo time
    allora ti chiedo:
    - Non ti basta un Varchar ben formattato ????
    - oppure un datetime ?????
    con il tipo time vedo che ci sono delle limitazioni ........
    lavorando su vista potrebbe essere cosi:
    codice:
    SELECT     
    Id, 
    c1, 
    c2, 
    ora, 
    FORMAT(ora, '00:00:00') AS Prova1, 
    CONVERT(datetime, FORMAT(ora, '00:00:00')) AS Prova2, 
    CONVERT(VARCHAR(8), FORMAT(ora, '00:00:00'), 108) AS Prova3
    FROM         
    dbo.T1
    ;
    Magari qualcuno piu esperto potra aiutarti meglio

    Facci sapere



    http://www.w3schools.com/sql/func_convert.asp
    Ultima modifica di nman; 17-03-2016 a 00:12

  5. #5
    Quote Originariamente inviata da nman Visualizza il messaggio
    Mhhhh!!!! abbastanza complicato .........
    La verita è che quella vista non la capisco
    (certamente per ignoranza mia)
    hai queste 3 tabelle (con 2 punti dentro nel nel nome ?????)
    - E_P..tim (con allias T)
    - E_P..dip (con allias D)
    - E_P..term (con allias term)
    poi ci sono altri campi che non si capisce da quale tabella arrivino ......




    Se invece ti interessa brutalmente solo
    la conversione di quel campo integer in campo time
    allora ti chiedo:
    - Non ti basta un Varchar ben formattato ????
    - oppure un datetime ?????
    con il tipo time vedo che ci sono delle limitazioni ........
    lavorando su vista potrebbe essere cosi:
    codice:
    SELECT     
    Id, 
    c1, 
    c2, 
    ora, 
    FORMAT(ora, '00:00:00') AS Prova1, 
    CONVERT(datetime, FORMAT(ora, '00:00:00')) AS Prova2, 
    CONVERT(VARCHAR(8), FORMAT(ora, '00:00:00'), 108) AS Prova3
    FROM         
    dbo.T1
    ;
    Magari qualcuno piu esperto potra aiutarti meglio

    Facci sapere



    http://www.w3schools.com/sql/func_convert.asp



    Chiedo scusa ho fatto un po' di confusione con il copia e incolla ...

    Comunque ho provato tutte e tre le soluzioni ma FORMAT proprio non lo digerisce ...

    Mi viene sempre passato lo stesso messaggio di errore:

    Messaggio 195, livello 15, stato 10, riga 7
    'FORMAT' is not a recognized built-in function name.

    Da quel che ho visto la funzione FORMAT è così:

    FORMAT(Param1 tinynt,param2 nvarchar(1))

    RETURNS nvarchar(1)
    IncorrectSyntax

  6. #6
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Quote Originariamente inviata da IncorrectSintax Visualizza il messaggio
    ....... Comunque ho provato tutte e tre le soluzioni ma FORMAT proprio non lo digerisce ... ....
    è vero, perché tu usi ancora la versione 2008 ( lo ho notato solo adesso )
    mentre io ho testato il tutto con la 2012

    infatti sono andato su una vecchia installazione 2008 e anche da me non lo digerisce


    Ma ti serve proprio un campo Time oppure ti va bene anche un Varchar ?????

    .

  7. #7
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Certamente si potra fare molto meglio,
    ma io con SQLServer 2008 R2 sono riuscito ad arrivare solo a quanto sotto .......
    Formato Nvarchar oppure DateTime

    per il formato Time con la mia limitatezza non riesco

    codice:
    SELECT     
    Id, 
    c1, 
    c2, 
    Ora, 
    RIGHT(N'000000' + CAST(Ora AS Nvarchar), 6) AS Base, 
    LEFT(RIGHT(N'000000' + CAST(Ora AS Nvarchar), 6), 2) + N':' + SUBSTRING(RIGHT(N'000000' + CAST(Ora AS Nvarchar), 6), 3, 2) + N':' + RIGHT(RIGHT(N'000000' + CAST(Ora AS Nvarchar), 6), 2) AS Nvar1, 
    CAST(LEFT(RIGHT(N'000000' + CAST(Ora AS Nvarchar), 6), 2) + N':' + SUBSTRING(RIGHT(N'000000' + CAST(Ora AS Nvarchar), 6), 3, 2) + N':' + RIGHT(RIGHT(N'000000' + CAST(Ora AS Nvarchar), 6), 2) AS Nvarchar) AS Nvar2, 
    CAST(LEFT(RIGHT(N'000000' + CAST(Ora AS Nvarchar), 6), 2) + N':' + SUBSTRING(RIGHT(N'000000' + CAST(Ora AS Nvarchar), 6), 3, 2) + N':' + RIGHT(RIGHT(N'000000' + CAST(Ora AS Nvarchar), 6), 2) AS datetime) AS DatTi  
    FROM         
    dbo.T1
    ;
    Magari verrà in soccorso qualcuno più esperto

    .
    Ultima modifica di nman; 18-03-2016 a 22:46

  8. #8
    Quote Originariamente inviata da nman Visualizza il messaggio
    Certamente si potra fare molto meglio,
    ma io con SQLServer 2008 R2 sono riuscito ad arrivare solo a quanto sotto .......
    Formato Nvarchar oppure DateTime

    per il formato Time con la mia limitatezza non riesco
    Ciao,

    hai fatto tutto ... basta fare il cast a time(0) invece che a datetime

    select cast('00:09:00' as time(0))

    Casomai , per rendere la query più leggibile si potrebbe creare una function;

    .... tipo questa giusto per fare anche un esempio di function in cui si usano i costrutti elementari
    di programmazione messi a disposizione, ma andrebbe bene anche come hai suggerito tu

    codice:
    use tempdb
    go
    
    
    if object_id('dbo.CvIntToTime') is not null 
      drop function dbo.CvIntToTime
    go
    
    
    create function dbo.CvIntToTime(@ihms int) 
    returns time(0)
    as
    begin 
    
    
     if @ihms is null return null
     
     declare @shms varchar(6);
     set @shms = CAST(@ihms as varchar(6))
     
     declare @tr time(0);
     declare @r int;
     declare @s varchar(6)
     declare @mul int
     
     set @tr='00:00:00'
     set @r=0
     set @mul=1
    
    
     while (LEN(@shms)>0)
     begin 
      set @s=right(@shms,2);
      
      if @mul=1
       set @r= @r + cast(@s as int)   
      else if @mul=2
       set @r= @r + cast(@s as int) * 60
      else 
       set @r= @r + cast(@s as int) * 3600
     
      set @shms=left(@shms,LEN(@shms)-len(@s));
      set @mul=@mul+1  
    end;
    
    
    return dateadd(second, @r, @tr);
    end
    
    go
    
    
    select  dbo.CvIntToTime(900);


    P.S.
    oltre 235959 'scavalla'
    Ultima modifica di sspintux; 20-03-2016 a 17:24

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.