Sql server 在日期时间值之间选择行的TSQL语法是什么
我有5分钟间隔的数据,24小时滚动,如下所示: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 [
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))