据我所知,您正在对日期进行大量转换,以便从时间部分中提取日期部分。有更快更简单的方法。我在这里使用的一种方法是:
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 )
此外,由于某种原因,您将@DateRangeFrom
and@DateRangeTo
与一个空字符串进行比较。假设这些是DateTime
按应有的方式键入的,则没有必要这样做。只需检查传递的值是否为空。
最后,在任何生成的 Select 语句中,您始终可以Convert
仅在输出上使用该函数。
Select Distinct Convert(varchar(10), DateAdd( d, DateDiff(d, 0, C.Entered), 0), 103)