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) 参数PEndDate
和PStartDate
可以使用Date
类型来取消时间部分
2) 您可以使用Convert
方法在匹配时只获取参数的日期部分。CONVERT (DATE, @PEndDate)
OR CONVERT(varchar,@PEndDate,103)
3) 使用 DateTime 函数仅从 DateTime 获取日期部分
ATEADD(dd, 0,
DATEDIFF(dd, 0, @PEndDate))
4) 使用 FLOOR
和 CAST
函数仅从 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
在 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) 参数PEndDate
和PStartDate
可以使用Date
类型来取消时间部分
2) 您可以使用Convert
方法在匹配时只获取参数的日期部分。CONVERT (DATE, @PEndDate)
OR CONVERT(varchar,@PEndDate,103)
3) 使用 DateTime 函数仅从 DateTime 获取日期部分
ATEADD(dd, 0,
DATEDIFF(dd, 0, @PEndDate))
4) 使用 FLOOR
和 CAST
函数仅从 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