Я согласен с Марком, что, похоже, это можно упростить. Чтобы ответить на ваш вопрос, хотя.
Две версии не совпадают. Верхний имеет
DECLARE @TweleveThirtyAM datetime
set @TweleveThirtyAM = '1900-01-01 00:30:00'
Второй имеет 30 секунд после полуночи
'1900-01-01 00:00:30'
Хотя вы все равно должны использовать формат ISO 1900-01-01T00:30:00.000
. Если в запросе подставлено правильное значение, оно выглядит как
SELECT
CASE
WHEN
(
CAST(segstart AS FLOAT) - floor(CAST(segstart AS FLOAT))
)
>= (CAST(CAST('1900-01-01T00:00:00.000' AS DATETIME) AS FLOAT) - floor(CAST(CAST('1900-01-01T00:00:00.000' AS DATETIME) AS FLOAT)))
AND
(
CAST(segstart AS FLOAT) - floor(CAST(segstart AS FLOAT))
)
< (CAST(CAST('1900-01-01T00:30:00.000' AS DATETIME) AS FLOAT) - floor(CAST(CAST('1900-01-01T00:30:00.000' AS DATETIME) AS FLOAT)))
THEN CAST('0' as int)
ELSE NULL
END AS Interval
FROM T
Это можно упростить до
SELECT
CASE
WHEN
(
CAST(segstart AS FLOAT) - floor(CAST(segstart AS FLOAT))
)
>= 0
AND
(
CAST(segstart AS FLOAT) - floor(CAST(segstart AS FLOAT))
)
< 1.0/48
THEN 0
ELSE NULL
END AS Interval
FROM T
Я не думаю, что первая часть может быть ложной, так что ее можно удалить, оставив
SELECT
CASE
WHEN
CAST(segstart AS FLOAT) - floor(CAST(segstart AS FLOAT)) < 1.0/48
THEN 0
ELSE NULL
END AS Interval
FROM T
Что может быть понятнее как
SELECT
CASE
WHEN
DATEPART(HOUR, segstart) = 0 AND DATEPART(MINUTE, segstart < 30)
THEN 0
ELSE NULL
END AS Interval
FROM T
Кроме того (и несколько более умозрительно), если только эти полчаса не имеют особого значения для вашего приложения, мне интересно, не является ли это частью гораздо более обширного случая, который делит день на 48 получасовых интервалов? Если это так, это может сделать работу.
SELECT 2 * DATEPART(HOUR, segstart) + DATEPART(MINUTE, segstart) / 30 AS Interval