2015-06-10 12 views
7

C'è una colonna nella mia tabella. In cui abbiamo memorizzato valore stringa in formato 'HH:MM' .Durante record fetching con questo tavolo ogni cose funziona bene conCome gestire DATEDIFF (MINUTE, '00: 00 ', '24: 20') Come lo scenario?

DATEDIFF(MINUTE, '00:00', ColumnName) 

problema è quando abbiamo valore maggiore di 23:59. Il suo errore di visualizzazione è

Conversione non riuscita durante la conversione di data e/o tempo dalla stringa di caratteri.

Qualcuno può suggerirmi l'approccio giusto per raggiungere questo scenario.

+2

L'approccio giusto è quello di utilizzare i tipi di dati appropriati. –

+0

quali rdbms stai usando? – ughai

+0

In realtà, dobbiamo salvare un valore maggiore di "23: 59" in modo che abbiamo preso il tipo di dati come Varchar. –

risposta

2

Così suona come il vostro risparmio la lunghezza di un periodo di tempo. Prova a memorizzarlo in pochi minuti. La mia query può gestire numeri di lunghezze diverse poiché si basa sui due punti.

DECLARE @yourTable TABLE (ColumnName VARCHAR(10)); 
INSERT INTO @yourTable 
VALUES ('100:00'), 
     ('24:20'); 

SELECT ColumnName, 
     (hr * 60) + minut AS time_period_in_minutes 
FROM @yourTable 
CROSS APPLY (SELECT CAST(SUBSTRING(ColumnName,0,CHARINDEX(':',ColumnName)) AS INT), 
        CAST(SUBSTRING(ColumnName,CHARINDEX(':',ColumnName) + 1,LEN(ColumnName)) AS INT)) CA(hr,minut) 

Risultati:

ColumnName time_period_in_minutes 
---------- ---------------------- 
100:00  6000 
24:20  1460 
+1

Grazie funziona per me. –

0

Prova a questa

select DATEDIFF(MINUTE, '00:00', case when ISDATE(ColumnName)=0 then '00:00' else ColumnName end) 
5

Se si memorizza il valore come qualcosa di diverso da un tempo, perché non solo memorizzare il numero di minuti e convertire in qualsiasi formato che si desidera in uscita?

In caso contrario, vorrei suggerire che è sufficiente convertire il valore in minuti:

select (cast(left(ColumnName, 2) as int) * 60 + 
     cast(right(ColumnName, 2) as int) 
     ) as Minutes 

Se non si utilizza i valori di data/ora, non v'è alcun obbligo per l'utilizzo delle funzioni specificamente pensate per loro.

EDIT:

Per gestire più ore del 99, utilizzare charindex():

select (cast(left(ColumnName, charindex(':', ColumnName) - 1) as int) * 60 + 
     cast(right(ColumnName, 2) as int) 
     ) as Minutes 
+0

Si sta fallendo nel caso in cui abbiamo il valore "100: 00" –

+0

@AshishBisht. modifica. Dovrebbe funzionare ora. –

Problemi correlati