0

我有以下功能:

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?

4

4 回答 4

0

指定函数参数的大小,例如 varchar(8)。否则默认为 1 个字符:

declare @c as varchar
set @c = '20130101'
select @c -- returns 2
于 2013-11-07T13:04:56.397 回答
0

试试这个:

创建函数 ISRELKDVG(@WUNSCH_LIEFERTERMIN VARCHAR(8)) 返回 int AS
开始
    声明 @sTerminNone VARCHAR(8)
    声明@sTerminFrom DATE
    SET @sTerminNone = '00000000'

    如果(@WUNSCH_LIEFERTERMIN = @sTerminNone)
        返回 0

    SET @sTerminFrom = DATEADD(day,-100,GETDATE()) -- 过去 100 天
    IF (CAST(@WUNSCH_LIEFERTERMIN 作为日期) >= @sTerminFrom)
        返回 1

    返回 0          
结尾

选择 dbo.ISRELKDVG('00000000') --0
选择 dbo.ISRELKDVG('20030901') --0
选择 dbo.ISRELKDVG('20130901') --1
选择 dbo.ISRELKDVG('20130730') --1

于 2013-11-07T13:06:10.120 回答
0

是的,这是主要问题。

MSDN - 备注

在数据定义或变量声明语句中未指定 n 时,默认长度为 1。使用 CAST 和 CONVERT 函数时未指定 n 时,默认长度为 30。

但是(即使在 Cast/Convert 的情况下),您应该始终定义长度以避免此类麻烦。

改变

@WUNSCH_LIEFERTERMIN VARCHAR --<--Length is 1 by default

@WUNSCH_LIEFERTERMIN VARCHAR(8) --Or length as appropriate

其次,你应该比较Dates not 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

理想情况下,您应该将 a 传递/定义DateType parameter给函数。

于 2013-11-07T13:02:20.137 回答
0

不要依赖隐式转换,使用未知的日期格式。转换为日期或日期时间,指定日期格式,然后比较这些值。

于 2013-11-07T12:54:20.223 回答