Qry select con campo datetime

di il
9 risposte

Qry select con campo datetime

Ciao,

ho una tabelle con un campo datetime 

Vorrei selezionare solo i records inerenti alla data 2022-12-12 . Devo convertire il campo in varchar e poi costruire la stringa della sola parte data ‘2022-12-12’ per fare un confronto?

E se volessi selezionare solo i records la cui data è superiore al 2022-12-07 ?

Grazie molte 

9 Risposte

  • Re: Qry select con campo datetime

    Ti basta selezionare tutti i record in cui il campo è compreso tra gli intervalli desiderati:

    SELECT *
    FROM Tabella
    WHERE REG_DataOra BETWEEN '2022-12-12 00:00:00' AND '2022-12-12 23:59:59'

    Per selezionare i record la cui data/ora è superiore ad una certa data ti basta usare l'operatore relazionale ‘>’:

    SELECT *
    FROM Tabella
    WHERE REG_DataOra > '2022-12-07'   -- Considera tutti gli orari successivi alla mezzanotte come buoni
    
    oppure
    
    WHERE Reg_DataOra > '2022-12-07 23:59:59'   -- Solo i record dal 08/12/2022 in avanti
  • Re: Qry select con campo datetime

    Ciao,

    Grazie !!!

  • Re: Qry select con campo datetime

    Salve,
    il filtro BETWEEN '2022-12-12 00:00:00' AND '2022-12-12 23:59:59' non e' completamente corretto in quanto SQL Server gestisce il tipo datetime con approssimazione ai 3ms, con delle... approssimazioni...
    eseguendo

    SELECT DATEADD(ms, -2, '2022-12-13') [LastOfDay], DATEADD(ms, 2, '2022-12-13') [FirstOfDay]
    --<--------
    LastOfDay               FirstOfDay
    ----------------------- -----------------------
    2022-12-12 23:59:59.997 2022-12-13 00:00:00.003

    appare evidente che ci sono 3 ms nei quali viene arrotondato sempre...
    ad ogni modo, "l'ultimo tik" della giornata avviene alle 23:59:59.997

    quindi il filtro sopra indicato esclude 997 ms, personalmente ho avuto a che fare con questo problema che ha causato non pochi problemi.

    Le scelte "tradizionali" di ricerca, quindi, si basano su come definire il time frame, e la soluzione piu' spesso utilizzata e'
    WHERE colonnaDateTime >= '2022-01-01' AND colonnaDateTime < '2022-01-02'
    al fine di non perdere pezzi indietro. L'operatore BETWEEN NON e' comprensivo in questo senso.

    Altre soluzioni riguardano l'estrazione della sola parte data dal tipo, e a seconda delle versioni di SQL Server si sono viste svariate proposte. SQL Server 2022 aggiunge DATETRUNC ! :D

    Tipicamente si utilizza 
    SELECT DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0)
    dove GETDATE() in questo caso sostituisce il valore della colonna da filtrare, e si basa sul concetto di estrarre la differenza in giorni tra il valore ed il giorno "0" (01/01/1900), ed a questo poi aggiungere questa differenza in giorni al giorno "0", ottenendo quindi un valore DATE arrotondato alla mezzanotte, quindi 0:0:0

    quindi, alla fine della fiera, il confronto diventa
    DECLARE @param DATETIME = GETDATE();
    SELECT *
    FROM ... 
    WHERE DATEADD(dd, DATEDIFF(dd,0, @param ), 0) = DATEADD(dd, DATEDIFF(dd,0, GETDATE()), 0) --< - nome della colonna


    salutoni romagnoli,
    -- 
    Andrea

  • Re: Qry select con campo datetime

    Ciao Andrea,

    grazie  per le informazioni.

    Probabilmente non ho ben capito  ma la Select:

    SELECT * FROM ST_Registrazioni sr 
    WHERE REG_DataOra >= '2022-12-13' AND REG_DataOra < '2022-12-14'

    a me da questo errore:

    Errore SQL [242] [S0003]: La conversione di un tipo di dati varchar in datetime ha generato un valore non compreso nell'intervallo dei valori consentiti.

  • Re: Qry select con campo datetime

    Salve @Fuel666,

    dipende dalla impostazioni di internazionalizzazione della “login” (i principal) con il quale sei connesso…

    probabilmente hai impostato la lingua italiana, e SQL Server NON riesce a tradurre dal formato yyyy-MM-dd
    prova con il formato yyyyMMdd, quindi

    WHERE REG_DataOra >= '20221213' AND REG_DataOra < '20221214'

    che corrisponde al formato ISO per le date….

    salutoni romagnoli,
    – 
    Andrea

  • Re: Qry select con campo datetime

    Ciao ,

    si così funziona

    Grazie

  • Re: Qry select con campo datetime

    13/12/2022 - asql ha scritto:


    Salve,
    il filtro BETWEEN '2022-12-12 00:00:00' AND '2022-12-12 23:59:59' non e' completamente corretto in quanto SQL Server gestisce il tipo datetime con approssimazione ai 3ms, con delle... approssimazioni...
    eseguendo

    SELECT DATEADD(ms, -2, '2022-12-13') [LastOfDay], DATEADD(ms, 2, '2022-12-13') [FirstOfDay]
    --<--------
    LastOfDay               FirstOfDay
    ----------------------- -----------------------
    2022-12-12 23:59:59.997 2022-12-13 00:00:00.003

    appare evidente che ci sono 3 ms nei quali viene arrotondato sempre...
    ad ogni modo, "l'ultimo tik" della giornata avviene alle 23:59:59.997

    quindi il filtro sopra indicato esclude 997 ms, personalmente ho avuto a che fare con questo problema che ha causato non pochi problemi.

    Questa non la sapevo. Grazie dell'informazione, può tornarmi utile.

  • Re: Qry select con campo datetime

    Ciao,

    tornando sull'argomento

    questa select comunque anche se affetta dal problema dei ms funziona

    SELECT * from ST_Registrazioni sr 
    WHERE REG_DataOra BETWEEN '2022-12-12 00:00:00' AND '2022-12-12 23:59:59'

    SELECT * from ST_Registrazioni sr 
    WHERE REG_DataOra BETWEEN '2022-12-15 00:00:00' AND '2022-12-15 23:59:59'

    invece da l'errore:

    Errore SQL [242] [S0003]: La conversione di un tipo di dati varchar in datetime ha generato un valore non compreso nell'intervallo dei valori consentiti.

    probabile che la data debba essere inserita come YYY-DD-MM  ma c'è un modo per evitarlo?

    Inoltre la select 

    SELECT * FROM ST_Registrazioni sr 
    WHERE REG_DataOra >= '20221212' AND REG_DataOra < '20221216'

    funziona 

    SELECT * FROM ST_Registrazioni sr 
    WHERE REG_DataOra = '20221212' 

    non restituisce risultato

    Grazie a tutti

  • Re: Qry select con campo datetime

    Salve a tutti,

    >Errore SQL [242] [S0003]: La conversione di un tipo di dati varchar in datetime ha generato un valore non compreso nell'intervallo dei valori >consentiti.

    >probabile che la data debba essere inserita come YYY-DD-MM  ma c'è un modo per evitarlo?

    l'unica formulazione valida, a parte il formato ISO, e' quella interpretabile secondo le impostazione di nazionalizzazione legato all'utente…
    oppure, si puo' specificare a livello di batch il comando indicato per 

    SET DATEFORMAT …..

    al di la' di cio', normalmente nel codice si cerca di non fare mai confronti con “stringhe” da convertire in un modo o l'altro, ma si usano i parametri, e solitamente il layer relativo, ad esempio sia ADO che Ado.Net, si occupano di interpretare correttamente e gestire il valore…

    > WHERE REG_DataOra = '20221212' 
    > non restituisce risultato

    a mio parere dipende dal fatto che il filtro e' impostato brutalmente sulle ore 0 del giorno indicato, e che per quel “tick”, non ci sono righe che soddisfano il requisito e viene logicamente ritornato un empty set…

    salutoni romagnoli
    – 
    Andrea

Devi accedere o registrarti per scrivere nel forum
9 risposte