1

我有一个选择,我需要确保我的 adate varchar(8) 在提供的两个日期之间。

有时传入的值是 NULL,所以我会显示所有内容。

select something from myTable where
convert(date, adate) >= ISNULL(convert(date,@beginDate), convert(date, adate)) 

工作正常

但是当我成功时:

select something from myTable where
convert(date, adate) >= ISNULL(convert(date,@beginDate), convert(date, adate)) 
and convert(date, adate) <= ISNULL(convert(date,@endDate), convert(date, adate))

我得到:

从字符串转换日期和/或时间时转换失败。

或者我可以在没有 >= 的情况下执行 <= 行而不会出错,但不能将它们都放在一起,这是怎么回事?

这两行看起来相同,我无法弄清楚我在这里做错了什么.....

4

3 回答 3

1

检查@endDate 的值。该参数是有效的 SELECT 和无效的 SELECT 之间的唯一区别。很有可能,它(有时)包含一个无法转换为日期的值。通常怀疑是空字符串 ( '')

于 2013-02-25T22:15:45.320 回答
1

看起来@startdate 和@enddate 都是字符串类型。最好的办法是让它们采用 ISO 格式(yyyymmdd),你应该没问题。

例如尝试使用这些;

Select @startdate = '20130101', @enddate = '20130221'
于 2013-02-25T22:26:00.243 回答
0

我不确定您要做什么,但是...由于任何值都可能来自 NULIFIED,因此您说您会在表中获得每个结果...因此仅设置查询可能会更容易在数据库之前使用您使用的语言对其进行过滤...

或者就像我会放一个 PHP 示例一样......

    IF ( !$beginDate || !$endDate )
    {
        $query = "SELECT * FROM myTable";
    }
    ELSE
    {
        $query = "SELECT * FROM myTable WHERE 'whatever clause'";
    }
于 2013-02-25T22:03:30.013 回答