Da Numero a Ora

di il
13 risposte

Da Numero a Ora

Ciao Sono nuovo del Forum....
ho fatto una breve ricerca su internet e nel forum per trovare delle risposte e mi sono imbattuto in questo forum... e visto che sono un appassionato e non un professionista, necessito di piccoli/grandi aiuti, e spero di contribuire e apprendere molte cose.

Detto ciò vengo al mio problema:
ho un campo int che vorrei trasformare in ora

Ora creazione - 161832 (che trasformato in ora dovrebbe corrispondere a 16:18:32)

come posso trasformarlo in ora? cioè avere il risultato 16:18:32?
non domandatemi perchè il campo sia int con questo formato, perchè il db e la tabella sono di un gestionale non mio quindi non modificabili, io devo solo estrarre dei dati tramite una query

grazie

13 Risposte

  • Re: Da Numero a Ora

    Trasforma in stringa e posiziona i caratteri :
  • Re: Da Numero a Ora

    Posiziona i caratteri in che senso?
  • Re: Da Numero a Ora

    Una volta che hai una stringa, ne formi un'altra prendendo i primi due caratteri a sinistra, aggiungi il :, aggiungi i due caratteri centrali, aggiungi il :, aggiungi i due caratteri finali.

    Sai usare le funzioni stringa?
  • Re: Da Numero a Ora

    federicopagliari ha scritto:


    Ciao Sono nuovo del Forum.... ho un campo int che vorrei trasformare in ora
    Definisci, esattamente, "ora": che tipo di variabile userai?
    Con che linguaggio?
    Anche se siamo nel forum di SQL Server serve definire meglio il contesto.
  • Re: Da Numero a Ora

    federicopagliari ha scritto:


    Posiziona i caratteri in che senso?
    Avendo un INT devi fare il CAST per ottenere un NVARCHAR, a quel punto usi SUBSTRING per estrarre le ore, minuti e secondi e componi una stringa inserendo i due punti :.
  • Re: Da Numero a Ora

    Si ma se uso questa "tecnica" non posso fare piu i calcoli.... ovvero

    io ho un'ora di scrittura di un record e devo impostare una query che entro 5 min da quella scrittura, parta una mail....

    la query generale l'ho scritta e funziona su altre tabella, ma non so perchè in questa tabella hanno messo il campo ora con quel formato, nelle altre ho il classico orario 16:30 e quindi non ho grossi problemi.......

    nicolap ha ragione, non ho definito alcune cose che ho dato per scontato...
    sono su MsSql server 2014 - linguaggio sql - perchè uso le query e le viste
  • Re: Da Numero a Ora

    federicopagliari ha scritto:


    Si ma se uso questa "tecnica" non posso fare piu i calcoli.... ovvero
    io ho un'ora di scrittura di un record e devo impostare una query che entro 5 min da quella scrittura, parta una mail....
    Prenditela con chi ha definito il campo in quel modo.
    Comunque non è che ci metta chissà quanto... guarda che è velocissima.
    Tu hai provato?

    federicopagliari ha scritto:


    nicolap ha ragione, non ho definito alcune cose che ho dato per scontato...
    sono su MsSql server 2014 - linguaggio sql - perchè uso le query e le viste
    Beh, si era capito.
    Siamo sulla sezione SQL Server, ed una query... può essere solo una query SQL.
  • Re: Da Numero a Ora

    No non ho provato... ora cerco di capire come usare i due comandi e inserirli nella mia query

    In sostanza la mia quey verifica tutti i documenti creati in quella data ed entro 5 minuti dall'orario indicato nel campo [createst] e ho uno schedulatore che esegue la query ogni 4 e se "vera" invia una mail.

    Vi scrivo la mia query ([createts] è il campo in questione)

    SELECT T0.[docnum], T0.[postdate], t0.[prodname], t0.[project], t0.usersign CreatedBy, T2.ItemCode, t3.ItemName, T2.baseqty, T2.UomCode
    FROM owor T0, OUSR T1, awo1 T2, OITM T3
    WHERE T0.UserSign = T1.UserId
    AND T0.DocEntry = T2.DocEntry
    AND T2.ItemCode = T3.ItemCode
    AND T0.[postdate] = cast(GetDate() as DATE)
    AND CONVERT(VARCHAR(2),GETDATE(),108)+RIGHT(CONVERT(VARCHAR(5),GETDATE(),108),2) >= (T0.[createts]-0)
    AND (T0.[createts]+5) >= CONVERT(VARCHAR(2),GETDATE(),108)+RIGHT(CONVERT(VARCHAR(5),GETDATE(),108),2)
  • Re: Da Numero a Ora

    federicopagliari ha scritto:


    No non ho provato... ora cerco di capire come usare i due comandi e inserirli nella mia query

    In sostanza la mia quey verifica tutti i documenti creati in quella data ed entro 5 minuti dall'orario indicato nel campo [createst] e ho uno schedulatore che esegue la query ogni 4 e se "vera" invia una mail.

    Vi scrivo la mia query ([createts] è il campo in questione)

    SELECT T0.[docnum], T0.[postdate], t0.[prodname], t0.[project], t0.usersign CreatedBy, T2.ItemCode, t3.ItemName, T2.baseqty, T2.UomCode
    FROM owor T0, OUSR T1, awo1 T2, OITM T3
    WHERE T0.UserSign = T1.UserId
    AND T0.DocEntry = T2.DocEntry
    AND T2.ItemCode = T3.ItemCode
    AND T0.[postdate] = cast(GetDate() as DATE)
    AND CONVERT(VARCHAR(2),GETDATE(),108)+RIGHT(CONVERT(VARCHAR(5),GETDATE(),108),2) >= (T0.[createts]-0)
    AND (T0.[createts]+5) >= CONVERT(VARCHAR(2),GETDATE(),108)+RIGHT(CONVERT(VARCHAR(5),GETDATE(),108),2)
    Qui di seguito indicativamente quello che ti hanno già detto in questo thread
    
    DECLARE @Ora int;
    DECLARE @OraStr varchar(8);
    DECLARE @OraTime time;
    set @Ora = 161251;
    set @OraStr = substring(CONVERT(varchar,@ora),1,2)+':'+substring(CONVERT(varchar,@ora),3,2)+':'+substring(CONVERT(varchar,@ora),5,2);
    set @OraTime = CONVERT(time,@OraStr);
    select @OraTime
    
  • Re: Da Numero a Ora

    Doctorj ha scritto:


    federicopagliari ha scritto:


    No non ho provato... ora cerco di capire come usare i due comandi e inserirli nella mia query

    In sostanza la mia quey verifica tutti i documenti creati in quella data ed entro 5 minuti dall'orario indicato nel campo [createst] e ho uno schedulatore che esegue la query ogni 4 e se "vera" invia una mail.

    Vi scrivo la mia query ([createts] è il campo in questione)

    SELECT T0.[docnum], T0.[postdate], t0.[prodname], t0.[project], t0.usersign CreatedBy, T2.ItemCode, t3.ItemName, T2.baseqty, T2.UomCode
    FROM owor T0, OUSR T1, awo1 T2, OITM T3
    WHERE T0.UserSign = T1.UserId
    AND T0.DocEntry = T2.DocEntry
    AND T2.ItemCode = T3.ItemCode
    AND T0.[postdate] = cast(GetDate() as DATE)
    AND CONVERT(VARCHAR(2),GETDATE(),108)+RIGHT(CONVERT(VARCHAR(5),GETDATE(),108),2) >= (T0.[createts]-0)
    AND (T0.[createts]+5) >= CONVERT(VARCHAR(2),GETDATE(),108)+RIGHT(CONVERT(VARCHAR(5),GETDATE(),108),2)
    Qui di seguito indicativamente quello che ti hanno già detto in questo thread
    
    DECLARE @Ora int;
    DECLARE @OraStr varchar(8);
    DECLARE @OraTime time;
    set @Ora = 161251;
    set @OraStr = substring(CONVERT(varchar,@ora),1,2)+':'+substring(CONVERT(varchar,@ora),3,2)+':'+substring(CONVERT(varchar,@ora),5,2);
    set @OraTime = CONVERT(time,@OraStr);
    select @OraTime
    
    Ti ringrazio gentilissimo... ora faccio qualche prova... sto solo cercando di capire dove mettere il codice che ha scritto nel mio codice... per fargli capire che il campo [creatst]è quello da "trasfomare"
  • Re: Da Numero a Ora

    1) perché non fai una sotto-query? Semplifica la vita
    2) perché non fai JOIN espliciti?
    3) stai verificato l'efficienza della query con il piano di esecuzione?

    P.S. Siete pregati di NON fare OVERQUOTING, per cortesia. Grazie.
  • Re: Da Numero a Ora

    gibra ha scritto:


    1) perché non fai una sotto-query? Semplifica la vita
    2) perché non fai JOIN espliciti?
    3) stai verificato l'efficienza della query con il piano di esecuzione?

    P.S. Siete pregati di NON fare OVERQUOTING, per cortesia. Grazie.
    non ho capito cosa intendi... potresti gentilmente spiegarmi?
    grazie
  • Re: Da Numero a Ora

    Salve a tutti,
    senza volonta' di essere esaustivo, il codice
    
    ...
        FROM owor T0, OUSR T1, awo1 T2, OITM T3
        WHERE T0.UserSign = T1.UserId
          AND T0.DocEntry = T2.DocEntry
          AND T2.ItemCode = T3.ItemCode
          ....
    
    indica una sintassi di definizione delle clausole di JOIN in stile ANSI 89, che e' deprecata tendenzialmente da tutti i produttori di database relazionali, non perche' meno efficiente ma sostanzialmente perche' fonte di errori di logica da parte dei programmatori, che a fronte di effettive impostazioni di filtro WHERE potrebbero non ben comprendere o specificate anche le clausole di JOIN, rischiando ad esempio l'esplosione di prodotti cartesiani invece dell'effettivo prodotto filtrato di JOIN, ed andrebbe riscritto in standard ANSI 92 dove esplicitamente le entita' vengono messe in relazione con clausole di JOIN appunto espliciti, tipicamente
    
    ...
      FROM owor T0
        {INNER|LEFT|RIGTH|OUTER} JOIN OUSR T1 ON T0.UserSign = T1.UserId
        {INNER|LEFT|RIGTH|OUTER} JOIN awo1 T2 ON T0.DocEntry = T2.DocEntry
        {INNER|LEFT|RIGTH|OUTER} JOIN OITM T3 ON T2.ItemCode = T3.ItemCode
      WHERE .... 
      ....
    
    relativamente ai piani di esecuzione, e' sempre bene verificare che il codice da noi scritto produca piani di esecuzione "efficienti", e per fare cio', senza utilizzare prodotti specifici quali ad esempio i prodotti di Idera ( https://www.idera.com/resourcecentral/datasheets/sql-workload-analysis ) o ancora meglio SQL Sentry ( https://www.sentryone.com/plan-explore ), si puo' anche utilizzare SQL Server Management Studio selezionando nel Menu Query almeno l'opzione "Display estimated execution plan", che, ad esempio, a fronte della query
    
    USE [Pubs]
    GO
    SELECT *
    	FROM [dbo].[employee] e;
    GO
    
    mostra come informazioni, che l'esecuzione della query comporta (ovviamente) un completo "clustered index scan", mentre ad esempio
    
    USE [Pubs]
    GO
    SELECT e.[emp_id], e.[fname], e.[lname]
    	FROM [dbo].[employee] e
    	WHERE e.[emp_id] = 'PMA42628M';
    GO
    
    indica un piano di esecuzione molto diverso, dove la query molto piu' ottimizzata sia in termini di limitazione, con identificazione specifica e limitata della proiezione, che con l'impostazione di un filtro molto restrittivo, consente la defizione di un piano che prevede solamente un "index seek" moltro performante...
    specificando anche l'impostazione di "include actual execution plan", si ha poi accesso alle indicazioni piu' approfondite e specifiche sull'esecuzione della esecuzione della query... anche qui, in hoovering con il mouse sul "blocco" interessante di piano, si ha accesso a preziose informazioni...
    Red Gate pubblica e distribuisce gratuitamente un valido compendio per meglio comprendere i significati piu' o meno nascosti nei piani di esecuzione, e l'ebook SQL Server Execution Plan e' liberamente scaricabile presso https://www.red-gate.com/simple-talk/books/sql-server-execution-plans-third-edition-by-grant-fritchey/

    altro strumento interessante risulta essere il SQL Server Profiler, eseguendo il quale ad esempio potresti verificare che il codice da te scritto (non relativamente alla definizione implicita di JOIN in standard ANSI 89), comporta, per ogni successiva esecuzione, uan alta percentuale di possibilita' di richiesta di ricompilazione della query, con discard degli eventuali piani di esecuzione, in quanto le entita' coinvolte nella query NON sono full qualified, cioe' non viene specificato l'owner, o meglio lo schema di appartenenza delle entita', e questo solitamente viene risolto dal Tokenizer di SQL Server forzando la ricompilazione della query ad ogni esecuzione, in quanto, a priori, il Tokenizer NON e' in grado di verificare quale entita' sia realmente coinvolta nella query nel caso di dicotomia in schemi differenti, cioe' dove ad esempio la base dati comprenda 2 schema diversi che entrambi contengano l'entita' [employee]; il database user [Andrea] vorra' ad esempio accedere all'entita' [employee] dello schema [schema1], mentre il database user [Federico] accedera' all'entita' [employee] dello schema [schema2]; questo ovviamento non e' un buon presupposto per riutilizzare piani di esecuzione nella cache, in quanto cosi' si spreca solo spazio e risorse;
    info utili riguardo la ricompilazione dei piani sono disponibili presso https://www.mssqltips.com/sqlservertip/5308/understanding-sql-server-recompilations/

    saluti omnia
    --
    Andrea
Devi accedere o registrarti per scrivere nel forum
13 risposte