Perché questa INSERT con istruzione DATEDIFF non funziona correttamente?
Domanda
INSERT INTO timecrunch.dbo.intervals (IntervalID, Duration)
SELECT ixInterval, DATEDIFF(hour, dtStart, dtEnd) FROM fogbugz.dbo.TimeInterval
WHERE dtEnd is not NULL
IntervalID è un int, la durata è un float
Sto cercando di mettere tutte le durate orarie nella colonna Durata ... Presumo che anche se è inferiore a un'ora utilizzerà una frazione, motivo per cui ho messo un float?
Guida.
PS: sta funzionando bene senza errori, ma dopo averlo fatto la tabella degli intervalli è ancora vuota ... So che i dati sono nella tabella TimeInterval però ...
Soluzione
Non sono sicuro del motivo per cui i tuoi dati non vengono visualizzati, ma DATEDIFF non restituirà un float. Per ottenere un float, probabilmente vorrai usare un'unità di tempo più piccola e dividere per il numero delle tue unità al minuto. Esempio:
DATEDIFF(second, dtStart, dtEnd) / (3600.0)
Altri suggerimenti
DATEDIFF restituisce un Int del numero di limiti della parte della data attraversati. Mi aspetto che tu ottenga la soglia del numero di ore di durata, a meno che non ci sia un problema con la conversione implicita da Int a Float.
È anche utile pubblicare il messaggio di errore ricevuto.
Per inserire le frazioni effettive di un'ora, utilizzare:
INSERT INTO timecrunch.dbo.intervals (IntervalID, Duration)
SELECT
ixInterval,
DATEDIFF(mi, dtStart, dtEnd) / 60.0
FROM
fogbugz.dbo.TimeInterval
WHERE
dtEnd is not NULL
DATEDIFF ti restituisce sempre un valore INT, mai una frazione.
Prova a eseguire SELECT da solo con il bit INSERT, per verificare che la tua query stia effettivamente restituendo alcuni dati.
Modifica: come altri hanno già detto, DATEDIFF restituisce un int, non un float, ma ciò non dovrebbe impedire a INSERT di inserire alcuni dati.
In primo luogo quali risultati si ottengono eseguendo la selezione?
In SQL Server DateDiff restituisce un int ( Vedi MSDN )
DATEDIFF restituirà un int non un float - è questo il problema che stai riscontrando?