日期范围的数据不相同

时间:2012-05-03 05:36:51

标签: sql sql-server-2005

我的sql有问题。问题是结果表中的数据与我输入的参数不一样。 你能检查我的代码有什么问题吗?。

这是我的代码: -

select distinct  convert(varchar(10),a.entered,103) as
daterange  from customer
where
((a.entered BETWEEN convert(varchar(10),&daterangefrom,103) AND convert(varchar(10),&daterangeto,103)) or (convert(varchar(10),&daterangefrom,103) =' ' AND convert(varchar(10),&daterangeto,103) =' '))

3 个答案:

答案 0 :(得分:3)

检查一下,它适用于我:

select distinct convert(varchar(10),a.entered,103) as daterange 
  from customer a 
 where ( ( a.entered BETWEEN convert(datetime,&daterangefrom,103) 
                         AND convert(datetime,&daterangeto,103) ) 
      or ( convert(datetime,&daterangefrom,103) = ' ' 
           AND convert(datetime,&daterangeto,103) = ' ' )
           )

答案 1 :(得分:2)

您将日期作为字符串进行比较,但您使用的dd / mm / yyyy格式不适用于此类比较。例如,'2/4/1976' > '1/9/2012'

将日期作为日期进行比较:

select distinct convert(varchar(10),a.entered,103) as daterange
from customer
where (
  (&daterangefrom = ' ' AND &daterangeto = ' ') or
  (a.entered BETWEEN &daterangefrom AND &daterangeto)
)

或者,使用基于ISO 8601的yyyy-mm-dd格式,它可以作为字符串比较使用:

select distinct convert(varchar(10),a.entered,103) as daterange
from customer
where (
  (a.entered BETWEEN convert(varchar(10),&daterangefrom,120) AND convert(varchar(10),&daterangeto,120)) or
  (&daterangefrom =' ' AND &daterangeto =' ')
)

答案 2 :(得分:1)

据我所知,您正在对日期进行大量转换,以便从时间部分中提取日期部分。有更快更简单的方法。我在这里使用的一种方法是:

DateAdd( d, DateDiff( d, 0, SomeDateValue ), 0 )

这将查找0日期(1900-01-01)和SomeDateValue之间的天数,然后将这几天添加到0日期,生成零时间部分的日期值。因此,根据您提供的内容,一个解决方案将是:

Select Distinct DateAdd( d, DateDiff( d, 0, C.Entered ), 0 ) As [Date]
From customer As C
Where   (
        C.Entered >= DateAdd( d, DateDiff( d, 0, @DateRangeFrom ), 0 )
        And 
        C.Entered < DateAdd( d, DateDiff( d, 0, @DateRangeTo ), 1 )
        )
    Or ( @DateRangeFrom Is Null And @DateRangeTo Is Null )

在此解决方案中,我使用>=<代替Between,以便我可以在@DateRangeTo值中添加额外的一天,并查找严格小于@DateRangeTo的所有值这个结束点。这确保了如果11:59:59传递了一个时间部分,我们就会使用当天的所有值,直到Select Distinct DateAdd( d, DateDiff( d, 0, C.Entered ), 0 ) As [Date] From customer As C Where ( C.Entered >= @DateRangeFrom And C.Entered < DateAdd( d, 1, @DateRangeTo ) ) Or ( @DateRangeFrom Is Null And @DateRangeTo Is Null ) 为止。如果您知道将始终使用零时间值传递这两个参数,那么您可以像这样简化查询:

@DateRangeFrom

此外,出于某种原因,您将@DateRangeToDateTime与空字符串进行比较。假设它们被称为Convert,应该是它们,没有必要这样做。只需检查传递的值是否为空。

最后,在任何生成的Select语句中,您始终只能在输出上使用Select Distinct Convert(varchar(10), DateAdd( d, DateDiff(d, 0, C.Entered), 0), 103) 函数。

{{1}}