1

我的 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) =' '))
4

3 回答 3

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) = ' ' )
           )
于 2012-05-03T05:43:16.590 回答
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 =' ')
)
于 2012-05-03T05:55:36.873 回答
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 )

在这个解决方案中,我使用>=and<而不是,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 )

此外,由于某种原因,您将@DateRangeFromand@DateRangeTo与一个空字符串进行比较。假设这些是DateTime按应有的方式键入的,则没有必要这样做。只需检查传递的值是否为空。

最后,在任何生成的 Select 语句中,您始终可以Convert仅在输出上使用该函数。

Select Distinct Convert(varchar(10), DateAdd( d, DateDiff(d, 0, C.Entered), 0), 103)
于 2012-05-03T06:03:03.150 回答