@ ronmurp вызывает действительную проблему - подход «бросок / пол» возвращает разные значения в одно и то же время. В дополнение к ответу @littlechris и для более общего решения, которое решает для моментов, которые имеют компонент в минуту, секунды и миллисекунды, вы можете использовать эту функцию для подсчета количества миллисекунд с начала дня.
Create Function [dbo].[MsFromStartOfDay] ( @DateTime datetime )
Returns int
As
Begin
Return (
( Datepart( ms , @DateTime ) ) +
( Datepart( ss , @DateTime ) * 1000 ) +
( Datepart( mi , @DateTime ) * 1000 * 60 ) +
( Datepart( hh , @DateTime ) * 1000 * 60 * 60 )
)
End
Я убедился, что он возвращает одно и то же int для двух разных дат с одинаковым временем
declare @first datetime
set @first = '1900-01-01 23:59:39.090'
declare @second datetime
set @second = '2000-11-02 23:56:39.090'
Select dbo.MsFromStartOfDay( @first )
Select dbo.MsFromStartOfDay( @second )
Это решение не всегда возвращает ожидаемое значение. Например, попробуйте ниже в SQL 2005, он возвращает int, заканчивающийся на «557» вместо «556».
set @first = '1900-01-01 23:59:39.556'
set @second = '2000-11-02 23:56:39.556'
Я думаю, что это связано с природой DateTime, хранящейся как float. Вы все еще можете сравнить два числа, хотя. И когда я использовал этот подход для «реального» набора данных DateTime, захваченного в .NET с помощью DateTime.Now () и сохраненного в SQL, я обнаружил, что вычисления были точными.