- 我想在TIME数据类型上使用SQL - BETWEEN
。
我想执行以下查询,但它没有给出正确的结果。
在这里,starttime
和endtime
这两个字段都是smalldatetime
的类型,因为我只需要时间比较,而且日期的值不是实际的,只是假的。{/ p>
SELECT
count(1)
FROM
t1 INNER JOIN t2
WHERE
CAST(t1.StartTime as TIME)
BETWEEN CAST(t2.StartTime as TIME)
AND CAST(t2.EndTime as TIME)
CAST(t1.StartTime as TIME) is 08:00:00.0000000
CAST(t2.StartTime as TIME) is 07:00:00.0000000
CAST(t2.StartTime as TIME) is 12:00:00.0000000
所以,上面的查询应该得到记录计数1(因为8点在7到12之间)。但它返回null。
请告诉我这里有什么问题以及如何纠正。
谢谢
答案 0 :(得分:1)
WHERE CAST(t1.StartTime as TIME) >= CAST(t2.StartTime as TIME)
AND CAST(t1.StartTime as TIME) <= CAST(t2.EndTime as TIME)
使用此Snytax可使您的查询成为SARGable。 Read Here有关在使用datetime / date / time数据类型时使查询具有可查询性的更多信息。
答案 1 :(得分:0)
之间的语法是正确的。您需要指定连接并提供如下on
子句:
SELECT count(1) FROM t1 INNER JOIN t2 on t1.col = t2.col
WHERE CAST(t1.StartTime as TIME) BETWEEN CAST(t2.StartTime as TIME) AND CAST(t2.EndTime as TIME)
答案 2 :(得分:0)
我怀疑你的例子是你在t1中在t1的开始和结束时间之间寻找时间,但是这两个表在任何键上都不一定有它们之间的关系。
尝试在该场景中使用连接将无法轻松工作,您必须将M. Ali的解决方案移动到连接谓词而不是where条件。
如果我的假设是正确的并且你只是在t2中寻找符合你们之间标准的t1行,这应该可以让你在没有两个表有关系的情况下进行设置:
DECLARE @sampleTime AS smalldatetime = GETDATE()
CREATE TABLE #t1 (StartTime smalldatetime)
CREATE TABLE #t2 (StartTime smalldatetime, EndTime smalldatetime)
INSERT INTO #t1 (StartTime) VALUES (@sampleTime)
INSERT INTO #t1 (StartTime) VALUES (DATEADD(hh, 6, @sampleTime))
INSERT INTO #t2 (StartTime, EndTime) VALUES (DATEADD(hh, -1, @sampleTime), DATEADD(hh, 3, @sampleTime))
-- you can see only one row in t1 lands between the Start and End in t2
SELECT * FROM #t1
WHERE EXISTS(SELECT * FROM #t2 WHERE CAST(#t1.StartTime AS time) BETWEEN CAST(#t2.StartTime AS time) AND CAST(#t2.EndTime AS time))
-- adding another row to t1 that now lands between the Start and End in t2 and the result
INSERT INTO #t1 (StartTime) VALUES (DATEADD(hh, 1, @sampleTime))
SELECT * FROM #t1
WHERE EXISTS(SELECT * FROM #t2 WHERE CAST(#t1.StartTime AS time) BETWEEN CAST(#t2.StartTime AS time) AND CAST(#t2.EndTime AS time))
DROP TABLE #t1, #t2