Operando di tipo di dati varchar non è valido per l’operatore di sottrazione

Ho bisogno di Sottrarre il tipo datetime dati ad esempio da una colonna come:

         datetime
    20/03/2013:03:17:43
    20/03/2013:03:17:43
    20/03/2013:03:17:44
    20/03/2013:03:17:44
    20/03/2013:03:17:44
    20/03/2013:03:17:44

Sto usando SQL Server 2008 R2 con la mia Query del tipo:

    SELECT basescore,

    MAX(datetime) - MIN(datetime)

    FROM log

    GROUP BY basescore

Ma per tutto il tempo mi dà un errore:

       Msg 8117, Level 16, State 1, Line 3
       Operand data type varchar is invalid for subtract operator.

Qualcuno può aiutarmi a risolvere questo errore? Grazie in anticipo!

  • Sono u certo la colonna di tipo DateTime?
  • no, tipo varchar!
  • Bingo. L’utilizzo di conversione.
  • Non conservare mai le date come qualcosa di diverso da data o data e ora. Mai!!!! Non counpound il problema con il cast o la conversione nel selezionare, fissare il modello di dati.
  • in realtà io sono l’importazione di tutti i dati da un file di excel e allora dimmi come posso convertire il tipo di dati!
  • ecco il codice per la conversione del tipo di dati: Selezionare convert(DateTime,<ColumnName>) From Nometabella.

InformationsquelleAutor user2496503 | 2013-07-26



4 Replies
  1. 3

    È la colonna è di tipo VarChar. Si prega di utilizzare la conversione in combinazione con la funzione DATEDIFF.

    SELECT basescore, DATEDIFF(DD,MAX(CAST([datetime] as datetime)), MIN(CAST([datetime] as datetime))) FROM log GROUP BY basescore

    Ma sono d’accordo – se la colonna contiene dati datetime – dovrebbe essere di tipo datetime.

    AGGIORNAMENTO: Si dispone di un punto e virgola tra la data e l’ora. Se non hanno il controllo dei dati importati, è possibile modificare la query di cui sopra, come

    SELECT basescore, DATEDIFF(DD,MAX(CAST(STUFF([datetime],11,1,' ') as datetime)), MIN(CAST(STUFF([datetime],11,1,' ') as datetime))) FROM log GROUP BY basescore

    Ma come potete vedere è sempre di più. Sarebbe molto più facile e più sicuro se la colonna è di tipo datetime.

    • Sei sicuro che è necessario quando si utilizza la funzione DATEDIFF invece di -? Gli esempi nella documentazione MSDN sembrano suggerire che non è: msdn.microsoft.com/en-us/library/ms189794.aspx
    • mi dà un errore di “Msg 174, Livello 15, Stato 1, Riga 1 La funzione datediff richiede 3 argomento(s)”
    • solo per MIN/MAX operatori, in modo che verrà eseguito sul tipo di dati corretto.
    • Scusa è stato un errore di battitura, extra ), corretto
    • ancora mi dà l’errore “Conversione non riuscita durante la conversione di data e/o orario da stringa di caratteri” lols qualche problema con esso ho cercato dallo scorso 4 ore lols
    • Ahh sì, bene, punto.
    • che punto e virgola tra data e ora – da importare? Se è così è necessario rimuovere prima il CAST avrebbe funzionato.
    • attendere vediamo
    • Aggiornata la risposta per il caso in cui i dati importati come è dimostrato
    • dà ancora errore “La conversione di un tipo di dati varchar per un tipo di dati datetime portato in un out-of-range value”
    • Che è una storia completamente diversa. La data è venuta in dd/mm/yyyy (Inglese) formato. Se SQL Server è in una Lingua diversa (ad esempio, CI mm/dd/yyyy) non sarà una data valida. Si dovrà consolidare in qualche modo – a modificare il sorgente o per cambiare la lingua del server o aggiungere ancora un altro codice di conversione che riporti il giorno e il mese

  2. 2

    “Operando di tipo di dati varchar non è valido per l’operatore di sottrazione” il tipo di dati varchar non è valido .. quindi utilizzare CAST per convertire il tipo di dati datetime

    • Che cosa ha fatto questo aggiungere oltre Yurly risposta?
  3. 0
     SELECT basescore,DATEDIFF(DD,MAX(datetime),MIN(datetime))FROM log GROUP BY basescore

Lascia un commento