none
PROBLEMA sql confronto tra date RRS feed

  • Domanda

  •         salve!
             ho 2 database
             [PLC] con campo DATA_ORA (datetime) con l'ora in dd/mm/yyyy hh:mm:ss.mmm (con i millesimi)

             come faccio a confrontare tale data con una data che proviene da un altra tabella
             myData_Ora CHE NON HA I MILLESIMI ?


           HO PROVATO A SCRIVERE IN UNA PROCEDURA VB6

           MA HO UN PROBLEMA DI CONFRONTO

    dim dTimeStamp_UltimoDati as date

    ....

    dTimeStamp_UltimoDati = rs!myData_ORA


    "select * from PLC where " & "Plc.Data_Ora > CONVERT(datetime,'" & _
                                                                                              myData_To_SQLSting(dTimeStamp_UltimoDati) & "',120) " & _
                                                                                           ")"

     dove


    Public Function mtData_To_SQLSting(dDataITA As Date) As String
      ' 2014 - converte data in formato ITALIANO in SQL stringa
     
      'Dim dDataITA As Date
      'dDataITA = Now
     
      'Debug.Print dDataITA
      'Debug.Print Format(dDataITA, "MM/dd/yyyy hh:mm:ss")
     
      mtData_To_SQLSting = Format(dDataITA, "MM/dd/yyyy hh:mm:ss")
    End Function

                 
    mercoledì 3 dicembre 2014 11:37

Risposte

  • direi di codice SQL

    ...

    WHERE plc.DATA_ORA (non vorrei avere tra i piedi i millesimi)

    >

    mydb.Data_ORA (che non ha i millesimi)

    come devo fare?

    Grazie anticpatamente

    Ciao, questo è un esempio di una query effettuata su due db sqlserver diversi
    (sempre però sulla stessa macchina):

    SELECT * FROM  [Db1].[dbo].[TbPrenotazioni] INNER JOIN [Db2].[dbo].[TbUtenti] 
    ON  [Db1].[dbo].[TbPrenotazioni].Cliente_ID = [Db2].[dbo].[TbUtenti].IdUtente
    WHERE CONVERT(datetime,[Db1].[dbo].[TbPrenotazioni].Partenza,105) > CONVERT(datetime,[Db2].[dbo].[TbUtenti].DataAccesso,105)
    
    Chiaramente non avendo la definizione delle tue due colonne ho fatto un esempio sul mio server.
    Questa query effettua una select su due DB confrontando due campi (uno Date e l'altro Datetime) delle due tabelle distinte.

    In SqlServer il riferimento ad una tabella è diviso in tre parti (sempre se i due DB
    si trovino sulla stessamacchina):
    [NomeDB].[Schema].[Tabella]


    Ti segnalo la guida su MSDN sulla funzione Convert di SQL SERVER.

    Ciao





    Paolo Pranzo

    mercoledì 3 dicembre 2014 21:31
  • Ciao,

    i confronti e la manipolazione dei tipi Date (DateTime, smalldatetime, date etc..) non sono sensibili all'impostazione di language: di fatto il confronto avviene sempre tra entità di tipo numerico.

    Se i sistemi coinvolti non fossero omogenei potresti sempre usare la funzione convert di cui sopra, avendo però l'accortezza di usare un formato naturalmente ordinato da sinistra a destra, come ad esempio l'ODBC (codice 120 senza ms oppure 121 con ms) oppure l'ISO (codice 127).

    L'utilizzo di convert nelle condizioni where può avere effetti molto pesanti sulle performances della query in quanto di fatto impedisce l'utilizzo di eventuali indici sui campi date coinvolti.

    Il formato 105 rimuove la parte ora (hh:mm:ss.mmm) in toto e quindi riduce il confronto alla sola parte data.

    G.


    venerdì 24 luglio 2020 09:18

Tutte le risposte

  • Ciao pfmarro,
    il tuo è un problema di codice vb6 o di codice SQL?

    Paolo Pranzo

    mercoledì 3 dicembre 2014 13:27
  • direi di codice SQL

    ...

    WHERE plc.DATA_ORA (non vorrei avere tra i piedi i millesimi)

    >

    mydb.Data_ORA (che non ha i millesimi)

    come devo fare?

    Grazie anticpatamente

    mercoledì 3 dicembre 2014 15:56
  • direi di codice SQL

    ...

    WHERE plc.DATA_ORA (non vorrei avere tra i piedi i millesimi)

    >

    mydb.Data_ORA (che non ha i millesimi)

    come devo fare?

    Grazie anticpatamente

    Ciao, questo è un esempio di una query effettuata su due db sqlserver diversi
    (sempre però sulla stessa macchina):

    SELECT * FROM  [Db1].[dbo].[TbPrenotazioni] INNER JOIN [Db2].[dbo].[TbUtenti] 
    ON  [Db1].[dbo].[TbPrenotazioni].Cliente_ID = [Db2].[dbo].[TbUtenti].IdUtente
    WHERE CONVERT(datetime,[Db1].[dbo].[TbPrenotazioni].Partenza,105) > CONVERT(datetime,[Db2].[dbo].[TbUtenti].DataAccesso,105)
    
    Chiaramente non avendo la definizione delle tue due colonne ho fatto un esempio sul mio server.
    Questa query effettua una select su due DB confrontando due campi (uno Date e l'altro Datetime) delle due tabelle distinte.

    In SqlServer il riferimento ad una tabella è diviso in tre parti (sempre se i due DB
    si trovino sulla stessamacchina):
    [NomeDB].[Schema].[Tabella]


    Ti segnalo la guida su MSDN sulla funzione Convert di SQL SERVER.

    Ciao





    Paolo Pranzo

    mercoledì 3 dicembre 2014 21:31
  • direi di codice SQL

    ...

    WHERE plc.DATA_ORA (non vorrei avere tra i piedi i millesimi)

    >

    mydb.Data_ORA (che non ha i millesimi)

    come devo fare?

    Grazie anticpatamente

    Ciao, questo è un esempio di una query effettuata su due db sqlserver diversi
    (sempre però sulla stessa macchina):

    SELECT * FROM  [Db1].[dbo].[TbPrenotazioni] INNER JOIN [Db2].[dbo].[TbUtenti] 
    ON  [Db1].[dbo].[TbPrenotazioni].Cliente_ID = [Db2].[dbo].[TbUtenti].IdUtente
    WHERE CONVERT(datetime,[Db1].[dbo].[TbPrenotazioni].Partenza,105) > CONVERT(datetime,[Db2].[dbo].[TbUtenti].DataAccesso,105)
    Chiaramente non avendo la definizione delle tue due colonne ho fatto un esempio sul mio server.
    Questa query effettua una select su due DB confrontando due campi (uno Date e l'altro Datetime) delle due tabelle distinte.

    In SqlServer il riferimento ad una tabella è diviso in tre parti (sempre se i due DB
    si trovino sulla stessamacchina):
    [NomeDB].[Schema].[Tabella]


    Ti segnalo la guida su MSDN sulla funzione Convert di SQL SERVER.

    Ciao





    Paolo Pranzo

    Ciao, ho lo stesso problema con l'aggiunta che i due database che confronto risiedono in machine diverse con lingue di sistema differenti, una in ITALIANO e l'altra in INGLESE..

    In questo caso come posso confrontare correttamente i due valori di data?


    Marco

    venerdì 24 luglio 2020 08:57
  • Ciao,

    i confronti e la manipolazione dei tipi Date (DateTime, smalldatetime, date etc..) non sono sensibili all'impostazione di language: di fatto il confronto avviene sempre tra entità di tipo numerico.

    Se i sistemi coinvolti non fossero omogenei potresti sempre usare la funzione convert di cui sopra, avendo però l'accortezza di usare un formato naturalmente ordinato da sinistra a destra, come ad esempio l'ODBC (codice 120 senza ms oppure 121 con ms) oppure l'ISO (codice 127).

    L'utilizzo di convert nelle condizioni where può avere effetti molto pesanti sulle performances della query in quanto di fatto impedisce l'utilizzo di eventuali indici sui campi date coinvolti.

    Il formato 105 rimuove la parte ora (hh:mm:ss.mmm) in toto e quindi riduce il confronto alla sola parte data.

    G.


    venerdì 24 luglio 2020 09:18
  • Grazie mille,

    alla fine ho modificato la funzione di MERGE per il confronto delle date in questo modo:

    convert(datetime, TARGET.[DataMod], 126) <> convert(datetime, SOURCE.[DataMod], 126) 


    Marco

    venerdì 24 luglio 2020 15:32