我有以下函数:
CREATE FUNCTION ISRELKDVG(@WUNSCH_LIEFERTERMIN VARCHAR) RETURNS int AS
BEGIN
DECLARE @sTerminNone VARCHAR(8)
DECLARE @sTerminFrom VARCHAR(8)
SET @sTerminNone = '00000000'
SET @sTerminFrom = CONVERT(VARCHAR(8), GETDATE() - 100, 112) -- 100 days in the past
IF (@WUNSCH_LIEFERTERMIN <> @sTerminNone AND @WUNSCH_LIEFERTERMIN >= @sTerminFrom)
RETURN 1
RETURN 0
END
作为函数参数给出的变量是一个日期,其形式为"YYYYMMDD"。问题是该函数永远不会返回 1。
我找到了链接,该链接说将 varchar 与未指定的长度进行比较可能会导致错误。它是否也指 varchar 传递给函数?
不要依赖隐式转换,使用未知的日期格式。转换为日期或日期时间,指定日期格式,并比较这些值。
指定函数参数的大小,例如 varchar(8)。否则,默认情况下长度为 1 个字符:
declare @c as varchar
set @c = '20130101'
select @c -- returns 2
试试这个:
CREATE FUNCTION ISRELKDVG(@WUNSCH_LIEFERTERMIN VARCHAR(8)) 返回 INT AS开始 声明@sTerminNone瓦尔查尔(8) 声明@sTerminFrom日期 SET @sTerminNone = '00000000' 如果 (@WUNSCH_LIEFERTERMIN = @sTerminNone) 返回 0 SET @sTerminFrom = DATEADD(day,-100,GETDATE()) -- 过去 100 天 如果(投射(@WUNSCH_LIEFERTERMIN 作为日期)>= @sTerminFrom) 返回 1 返回 0 结束选择 DBO。ISRELKDVG('00000000') --0选择 DBO。ISRELKDVG('20030901') --0选择 DBO。ISRELKDVG('20130901') --1选择 DBO。ISRELKDVG('20130730') --1
是的,这是主要问题。
MSDN - 备注
当数据定义或变量声明中未指定 n 时 语句,默认长度为 1。使用时未指定 n 时 CAST 和 CONVERT 函数,默认长度为 30。
但是(即使在转换/转换的情况下),您也应该始终定义长度以避免此类麻烦。
改变
@WUNSCH_LIEFERTERMIN VARCHAR --<--Length is 1 by default
自
@WUNSCH_LIEFERTERMIN VARCHAR(8) --Or length as appropriate
其次,您应该比较Dates
而不是Strings
。
DECLARE @sTerminNone DATE = CONVERT(DATETIME, 0) --<--DATE (Assign correct date)
DECLARE @sTerminFrom DATE = GETDATE() - 100
最后
IF (CONVERT(DATE, @WUNSCH_LIEFERTERMIN, 112) <> @sTerminNone AND --Not sure if you need this
CONVERT(DATE, @WUNSCH_LIEFERTERMIN, 112) >= @sTerminFrom)
RETURN 1
ELSE
RETURN 0
理想情况下,您应该向函数传递/定义DateType parameter
。