如何返回存储为日期和时间的两个日期时间之间的行?

Mar*_*din 3 sql-server

如何查看两个日期和时间之间的结果?

我目前的代码:

SELECT * 
FROM [DB].[dbo].[TABLE] 
WHERE [USER_ID] = '005'    
AND [DATE] BETWEEN '03-04-2016' AND '04-04-2016'
AND [TIME] >= '21:00:00'                   -- for date 03-04-2016
AND [TIME] <= '05:00:00'                   -- for date 04-04-2016

ORDER BY [DATE] ASC, [TIME] ASC
Run Code Online (Sandbox Code Playgroud)

此代码不起作用,我不知道如何修复它

为什么这个请求不起作用?

Mar*_*ith 8

任何行都不可能同时满足[TIME] >= '21:00:00'[TIME] <= '05:00:00'

SQL Server 不会读取您的源代码注释来知道应该有条件地应用时间。

您需要更改代码以便在边界日期上有条件地应用这些谓词(假设搜索日期为剩余谓词),因此时间元素仅与这些条件适用的日期相关。

SELECT *
FROM [DB].[dbo].[TABLE] 
WHERE [USER_ID] = '005'   
AND [DATE] BETWEEN '20160403' AND '20160404'
AND ([TIME] >= '21:00:00' OR [DATE] > '20160403')
AND ([TIME] <= '05:00:00' OR [DATE] < '20160404') ;
Run Code Online (Sandbox Code Playgroud)

或等价物(虽然您需要检查执行计划以提高效率,但可能更多地自我记录):

SELECT *
FROM [DB].[dbo].[TABLE] 
WHERE [USER_ID] = '005'   
AND ( [DATE] = '20160403' AND [TIME] >= '21:00:00'
  -- OR [DATE] > '20160403' AND [DATE] < '20160404'
   OR [DATE] = '20160404' AND [TIME] <= '05:00:00'
    ) ;
Run Code Online (Sandbox Code Playgroud)