Поскольку вы используете SQL Server 2008, вы можете воспользоваться новым типом данных Time
. Чтобы преобразовать целое число в значение времени, мы должны предположить, что последние две цифры - минуты. Чтобы получить мельчайшую часть, разделите на 100, возьмите целочисленную часть и вычтите ее из начального значения. Таким образом, в случае 621 мы получаем:
621 - Floor(621/100)* 100
621 - Floor(6.21)*100
621 - 6*100
621 - 600 = 21 minutes
Для части часа мы можем просто взять целочисленное значение после деления на 100.
Create Table #Test( IntVal smallint not null )
Insert #Test Values( 621 )
Insert #Test Values( 2359 )
Insert #Test Values( 1200 )
Insert #Test Values( 1201 )
Insert #Test Values( 1159 )
Select Z.TimeVal, GetDate(), DateDiff(hh, Z.TimeVal, Cast(GetDate() As Time(0)))
From (
Select Cast(DateAdd(mi
, IntVal - Floor(IntVal/100)*100
, DateAdd(hh, Floor(IntVal/100), 0)
) As Time(0)) As TimeVal
From #Test
) As Z
Часть хитрости здесь заключается в использовании DateAdd(hh, Floor(IntVal/100), 0)
, который делает DateAdd
против нулевого значения для datetime.