我有一个表,其中包含两个单独列中记录的创建日期和创建时间。
SELECT
T0.[ID] AS ' ID',
T0.[customer] AS 'Customer Name',
T0.[status] AS 'Status',
T0.[createDate] AS 'Creation Date',
T0.[createTime] AS 'Creation Time'
FROM
[ret].[MRCL] T0
WHERE
T0.[status] Like N'%-3%'
创建日期存储为DATE,例如
10.05.17
09.03.17
由于某种原因(我无法控制)的时间存储为(-32,768到:32,767)之间的数字,例如
15:20
10:56
09:25
我正在寻找一种方法来过滤掉超过' 2'小时。
答案 0 :(得分:0)
这很痛苦,但是对于SARGable利用任何可用索引的东西,我们可以创建参数来满足标准,而不是将表列转换为实际有意义的东西。
使用convert()
个样式和replace()
生成表格中使用的smallint
时间格式:
declare @hoursbefore int = 16;
declare @beforeDate date = convert(date,dateadd(hour,-@hoursbefore,getdate()));
declare @beforeTimeSmallint smallint = convert(smallint,replace(convert(char(5),dateadd(hour,-@hoursbefore,getdate()),108),':',''));
并像这样使用:
select *
from t
where t.[status] like N'%-3%'
and ( CreateDate < @beforeDate
or (CreateDate = @beforeDate and CreateTime < @beforeTimeSmallint)
)
转换细分:
declare @beforeTimeSmallint smallint =
convert(smallint
,replace(
convert(char(5)
,dateadd(hour,-@hoursbefore,getdate()) /* reduce current date by amount of hours */
,108 /* time as hh:mi:ss */ )
,':','') /* replacing the semicolon */
);