2015-09-14 5 views
6
Select * 
from tableA 
inner join tableB on tableA.id = tableB.aid 
        and cast(a.date AS DATETIME) = CAST('2015-08-24' AS DATETIME) 

I valori memorizzati in tableA.date sono "2015-08-24", ovvero i dati non presentano problemi.SQL non consente il cast della colonna della data a datetime?

Quando eseguo la dichiarazione di cui sopra, ho

La conversione di un tipo di data di dati a un tipo di dati datetime ha provocato un valore out-of-range

Posso sapere perché Non posso trasmettere una colonna date a datetime?

+3

Sei sicuro che TUTTI i valori in 'a.date' sono date valide in un formato non ambiguo? (ad es. '1-2-2015' è ambiguo perché potrebbe essere il 2 gennaio del 1 ° febbraio) –

+0

@D Stanley: Ha dati di una riga con valore '0001-01-01', potrebbe essere questo il motivo per cui mi ha gettato quell'errore? –

+0

cosa ottieni se esegui select max (a.date), min (a.date) da tableA a – Kevin

risposta

8

La causa principale del problema è questo:

  • il tipo di dati DATE ha una gamma di valori accettati da 01-01-0001 attraverso 12-31-9999
  • il tipo di dati DATETIME ha una gamma di valori accettati da 01-01-1753 attraverso 12-31-9999

Quindi se si dispone di un DATE da prima del 1753 o di un valore vuoto/NULL, questo sarà al di fuori dell'intervallo consentito da DATETIME.

Si dovrebbe smettere di usare DATETIME In SQL Server 2008 e più recenti. Utilizzare invece DATETIME2(n) (dove n indica il numero di secondi frazionari necessari).

Quindi provare questo:

select * 
from tableA 
inner join tableB on tableA.id = tableB.aid 
        and cast(a.date AS DATETIME2(3)) = CAST('2015-08-24' AS DATETIME2(3)) 

e sono sicuro che questo funzionerà bene.

0

Utilizzare il formato aaaammgg che è universale in SQL Server,

Select * from tableA inner join tableB 
on tableA.id = tableB.aid 
and cast(a.date AS DATETIME) = CAST('20150824' AS DATETIME) 

non ho visto il problema con il '0001-01-01' valore nel a.Date U potrebbe fare un po 'sporco trucco In questo modo

Select * from tableA inner join tableB 
on tableA.id = tableB.aid 
and case when substring(a.date, 1, 2) not in ('19', '20') then null else CAST(a.date AS DATETIME) end = CAST('20150824' AS DATETIME) 
0

Provare ad incorporare ISDATE() solo per assicurarsi che i dati siano validi. (Sembra tableA.date è una stringa.)

Select * from tableA inner join tableB 
     on tableA.id = tableB.aid 
     and ISDATE(tableA.date) 
     and cast(tableA.date AS DATETIME) = CAST('2015-08-24' AS DATETIME) 
Problemi correlati