SQL 服务器按 DateTime 列过滤,有时会提供 TIME 部分

SQL Server Filtering by DateTime column, when TIME portion is provided sometimes

在 SSRS 报表中,用户根据开始日期和结束日期进行搜索。

挑战在于,正如我最近发现的那样,他有时(并非总是)在搜索时提供时间组件。

目前过滤是这样的:

if @pEndDate is null  
  SET @pEndDate = getdate()  
SET @PEndDate = DateAdd(dd,1,@PEndDate) 

SELECT ........
FROM .....
WHERE ( Createdon >= @PStartDate AND Createdon < @PEndDate)

当他没有时间搜索时这很好(示例 - @PStartDate = 2/23/2015 和 @PEndDate = 2/24/2015)

当他提供时,我应该如何构建查询来处理时间部分? (示例 - @PStartDate = 2/23/2015 15:00 和@PEndDate = 2/24/2015 15:00)

如果在别处有答案,请指出。谢谢。

如果您只想匹配日期部分,那么有很多选择。

1) 参数PEndDatePStartDate可以使用Date类型来取消时间部分

2) 您可以使用Convert方法在匹配时只获取参数的日期部分。CONVERT (DATE, @PEndDate) OR CONVERT(varchar,@PEndDate,103)

3) 使用 DateTime 函数仅从 DateTime 获取日期部分 ATEADD(dd, 0, DATEDIFF(dd, 0, @PEndDate))

4) 使用 FLOORCAST 函数仅从 DateTime 获取日期部分

CAST( -- Convert the integer to DATE
 FLOOR(-- Get largest Integer less than or equal to the decimal value
   CAST(GETDATE() AS DECIMAL(12, 5)) -- Convert DATETIME to DECIMAL)   
   AS DATETIME) 'Date Part Only'

5) 使用 DATEPART 和 CONVERT 函数仅从 DateTime 获取日期部分

CONVERT(VARCHAR(4),DATEPART(YEAR, @GETDATE)) 
       + '/'+ CONVERT(VARCHAR(2),DATEPART(MONTH, @GETDATE)) 
       + '/' + CONVERT(VARCHAR(2),DATEPART(DAY, @GETDATE)) 
         'Date Part Only'

用你觉得合适的方法就可以了。


更新

正如您提到的,您需要将时间部分设为 00:00 和日期,这样您就可以尝试,

SELECT CAST( convert(varchar(10),GETDATE(),112) AS DATETIME)
--This will give you 2015-02-27 00:00:00.000
SELECT DATEADD(ms,-3, DATEADD(day, DATEDIFF(day,0,GETDATE())+1,0))
--This will give you end of days time 2015-02-27 23:59:59.997
SELECT CONVERT(nvarchar,getdate(),103) + ' 12:59:59 PM'
--This will give you custom time 27/02/2015 12:59:59 PM