Sql server 在日期时间值之间选择行的TSQL语法是什么

Sql server 在日期时间值之间选择行的TSQL语法是什么,sql-server,tsql,Sql Server,Tsql,我有5分钟间隔的数据,24小时滚动,如下所示: LogTime ------------- 7/1/2017 7:01 7/1/2017 7:06 7/1/2017 7:11 7/1/2017 7:16 ... 7/2/2017 6:56 我需要一个TSQL查询来选择给定日期的所有行,例如,从07/02 00:00:00到07/02 06:59:59的条目被视为07/01数据的一部分 我正在SSMS的编辑器窗格中使用此查询: SELECT * FROM [LogEntries] WHERE [

我有5分钟间隔的数据,24小时滚动,如下所示:

LogTime
-------------
7/1/2017 7:01
7/1/2017 7:06
7/1/2017 7:11
7/1/2017 7:16
...
7/2/2017 6:56
我需要一个TSQL查询来选择给定日期的所有行,例如,从
07/02 00:00:00
07/02 06:59:59
的条目被视为
07/01
数据的一部分

我正在SSMS的编辑器窗格中使用此查询:

SELECT * FROM [LogEntries] WHERE [LogTime] BETWEEN '20170701 06:59:59' AND '20170702 07:00'
这里的问题是字符串需要从
DateTime
值逻辑构造

这可以通过传入
DateTime
参数在单个查询语句中完成吗?我这样做是为了一个SSRS报告,如果不需要的话,我不想求助于存储过程。

最简单的解决方案(虽然不是,所以可能不是最好的)就是从
日志时间值中减去7小时:

DECLARE @DateTime DateTime = GETDATE();

SELECT * 
FROM [LogEntries] 
WHERE CAST(DATEADD(HOUR, -7, [LogTime]) AS DATE) = CAST(@DateTime AS DATE);
sargable解决方案有点麻烦,但仍然非常简单:

SELECT * 
FROM [LogEntries] 
                   -- 07 am on the date of the @DateTime variable
WHERE [LogTime] >= CAST(CAST(@DateTime AS DATE) As DateTime) + CAST('00:07:00' As DateTime) 
                 -- 07 am one day after the date of the @DateTime variable
AND  [LogTime] < DATEADD(DAY, 1, CAST(CAST(@DateTime AS DATE) As DateTime) + CAST('00:07:00' As DateTime)) 
问题指出“这里的问题是字符串需要从DateTime值逻辑构造”

在OP引用的示例中,示例D(日期时间)表示:

D.将BETWEEN与datetime值一起使用

下面的示例检索datetime值介于“20011212”和“20020105”之间的行

选择BusinessEntityID,RateChangeDate
来自人力资源部。EmployeePayHistory
其中,费率变更日期介于“20011212”和“20020105”之间

这使得DateTime值似乎需要作为字符串提供。他们没有。您可以使用datetimes


Zohar的回答解决了问题的时间转移部分。

使用
convert
将字符串转换为日期时间。是的,可以用参数来完成。@Richardissimo:另一种方法是将传入的
DateTime
参数转换为字符串。如果你说
logtime
是一种字符串,我强烈建议将其改为DateTime2。例如,任何时候您想要处理该列,您都可能需要将其转换为datetime,所以为什么不这样存储它呢。另外,它将占用更少的存储空间。@Richardisimo:它不是一个字符串,而是一个
DateTime
,per.@a\u horse\u没有名称:它是一个
DateTime
列。看。
不是sargable,所以它可能不是最好的
我认为这不会有太大问题。我们一年只能得到大约5万排,所以这为我们赢得了很多时间。回答得很好,谢谢!想一想,我可以创建另一列来存储适用的日期。当我创建记录时,我可以在代码中加入减法逻辑。这应该是可搜索的。我也用一个可搜索的解决方案编辑了我的答案。@InteXX-如果要存储适用的日期,并且计算总是-7小时,那么应该将其存储为一个持久的计算列。这样,应用程序就不必做任何事情。数据库将自动为您计算它。@InteXX要添加到Damien编写的内容中-如果您将其存储为持久化计算列,则数据库仅在它所依赖的列发生更改时才计算它。如果它只是一个计算列(不是持久化的),那么每次你在语句中使用它时,数据库都会计算它。虽然你的读心术令人印象深刻,但不幸的是,我看不出这是如何为实际问题提供答案的。我不是反对你的答案,但我确实把它标为NAA。
SELECT * 
FROM [LogEntries] 
                -- 7 AM
WHERE [LogTime] >= CAST(@Date As DateTime) + CAST('00:07:00' As DateTime)
                -- 7 AM on the next day
AND  [LogTime] <= DATEADD(DAY, 1, CAST(@Date As DateTime) + CAST('00:07:00' As DateTime))