查询日期范围增强函数 fn_ltDate3
来源:互联网 发布:非诚勿扰软件 编辑:程序博客网 时间:2024/06/08 08:04
IF EXISTS( SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].fn_ltDate3') AND (TYPE = 'FN' OR TYPE = 'TF' OR TYPE = 'IF') ) BEGIN PRINT '已存在,删除再新建' DROP FUNCTION fn_ltDate3 END ELSE BEGIN PRINT '不存在,新建' END GO --Create by: yenange, on 2013-01-18 --Description: 前日期是否<=后面的日期(在同一天也算是小于等于), 专用于查询列表时判断日期(FormDate,ToDate)是否在范围之中 -- 不需要再判断是否为null或者为空串, 也不需要加给日期加" 23:59:59" 等 --Parameters : @startDate 前日期,@endDate 后日期,@queryParaPosition 查询参数的位置 -- 两参数传入时的类型可为 varchar 或者 datetime 型 -- 若有一参数为null或者'', 则返回1 (也算是小于等于) --Demo : --WHERE dbo.fn_ltDate(@StartDate1, CreateTime, 0) = 1 -- AND dbo.fn_ltDate(CreateTime, @EndDate1, 1) = 1 --注: 1. 页面中的参数,如果没有值时,请直接传空串或者NULL。 不要传Form最小值/To最大值过来,如 ( from: 2001-01-01; to: 2020-01-01/9999-12-31 ) -- 2. 还有一个函数fn_ltDate, 那个函数只适用于表中的日期字段不可能为null的情况,不建议再使用。 -- 以后无论哪种情况,请以此函数fn_ltDate3为准。 --Return : 是 1 否 0 Create FUNCTION [dbo].[fn_ltDate3](@startDate VARCHAR(32),@endDate VARCHAR(32),@queryParaPosition INT)RETURNS BITASBEGINDECLARE @result BIT --此处是为适应某些表中的日期型字段有NULL值. modify by ngye, on 2013-01-10IF ( ( @queryParaPosition = 0--查询参数在第0个位置, (列字段在第1个位置,对应@endDate) AND LTRIM(RTRIM(ISNULL(@startDate, ''))) != ''--查询参数不为空 AND DATEDIFF(DAY, @startDate, '1900-01-01') != 0--查询参数不是最早的日期 AND @endDate IS NULL--列字段为 NULL ) OR ( @queryParaPosition = 1--查询参数在第1个位置, (列字段在第0个位置,对应@startDate) AND LTRIM(RTRIM(ISNULL(@endDate, ''))) != ''--查询参数不为空 AND DATEDIFF(DAY, @endDate, '1900-01-01') != 0--查询参数不是最早的日期 AND @startDate IS NULL--列字段为 NULL ) )BEGIN RETURN 0ENDSET @result = 0 IF ( LTRIM(RTRIM(ISNULL(@startDate, ''))) = '' OR LTRIM(RTRIM(ISNULL(@endDate, ''))) = '' OR DATEDIFF(DAY, @startDate, '1900-01-01 00:00:00.000') = 0 OR DATEDIFF(DAY, @endDate, '1900-01-01 00:00:00.000') = 0 OR DATEDIFF(DAY, @startDate, @endDate) >= 0 )BEGIN SET @result = 1END RETURN @resultEND