Datepart для времени между (вместо даты конвертации) - PullRequest
2 голосов
/ 20 декабря 2011

Есть ли способ использовать Datepart для выбора строк, которые имеют время между 12:20 и 15:50, используя datepart, потому что преобразование даты в время для меня необычайно медленно?

Ответы [ 3 ]

2 голосов
/ 20 декабря 2011

Например, вы можете использовать это

DECLARE 
    @min FLOAT = CAST(CAST('19000101 12:20' AS DATETIME) AS FLOAT),
    @max FLOAT = CAST(CAST('19000101 15:50' AS DATETIME) AS FLOAT)

SELECT 
    *
FROM table
WHERE CAST(DateField AS FLOAT) - FLOOR(CAST(DATEFIELD AS FLOAT)) BETWEEN @min AND @max

Но на самом деле это не решение !!!

Лучший способ - ввести еще 1 вычисленныйстолбец как

NewColumn AS DATEPART(HOUR, DateColumn)*100+DATEPART(minute, DateColumn)  

Создайте для него индекс и используйте выражение where

WHERE NewColumn BETWEEN 1220 AND 1550
0 голосов
/ 20 декабря 2011

Единственная альтернатива - использовать CTE. Протестировал и все работает.

LH = низкий час ЧЧ - Высокий час LM - низкая минута HM = высокая минута

;WITH CTE_LH AS 
(
SELECT *  
FROM DateTable 
WHERE (DATEPART(HOUR, DateCol) >= 12)
)
, CTE_HH AS 
(
SELECT *  
FROM CTE_LH 
 WHERE (DATEPART(HOUR,DateCol) <= 15 )
)
,CTE_LM AS 
(
SELECT *  
FROM CTE_HH 
WHERE (DATEPART(MINUTE,DateCol) >= 20 )
)
,CTE_HM AS 
(
SELECT *  
FROM CTE_LM 
WHERE (DATEPART(MINUTE,DateCol) <= 50 )
)
SELECT * FROM CTE_HM;
0 голосов
/ 20 декабря 2011

Предполагаемые периоды времени в один и тот же день;

...
where cast(fld as time) between '12:20' and '15:50'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...