我的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) =' '))
答案 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
此外,出于某种原因,您将@DateRangeTo
和DateTime
与空字符串进行比较。假设它们被称为Convert
,应该是它们,没有必要这样做。只需检查传递的值是否为空。
最后,在任何生成的Select语句中,您始终只能在输出上使用Select Distinct Convert(varchar(10), DateAdd( d, DateDiff(d, 0, C.Entered), 0), 103)
函数。
{{1}}