SQL BETWEEN Time 不显示结果
Posted
技术标签:
【中文标题】SQL BETWEEN Time 不显示结果【英文标题】:SQL BETWEEN Time doesn't show results 【发布时间】:2019-11-11 01:45:49 【问题描述】:可以使用新鲜的 POV 帮助:)
需要显示午夜到凌晨 4 点之间的行程。 StartTime
列的类型为 DATETIME
。我已经试过了
CAST(StartTime AS TIME) BETWEEN CAST('00:00:00' AS TIME) AND....
但它没有显示正确的结果,所以我已经完成了这个IIF
,但即使StartTime
不在午夜和凌晨 4 点之间,结果显示 1。我错过了什么吗?感谢您的帮助!
SELECT
id
, StartTime
, DATEADD(d, 0, DATEDIFF(d, 0, StartTime)) AS Midnight
, DATEADD(hh, +4 , DATEDIFF(d, 0, StartTime)) AS FourAM
, IIF((StartTime BETWEEN DATEADD(d, 0, DATEDIFF(d, 0, StartTime))
AND DATEADD(hh, +4 , DATEDIFF(d, 0, StartTime))), 1, 0) _Between_Check
FROM
FUN.Trip
结果:
ID | StartDate | Midnight | FourAM | Between_Check
------------+-----------------------+-------------------------+-------------------------+--------------
-2135024021 | 19-10-02 00:04:01.000 | 2019-10-02 00:00:00.000 | 2019-10-02 00:04:00.000 | 1
-2135024228 | 19-10-05 00:04:30.000 | 2019-10-05 00:00:00.000 | 2019-10-05 00:04:00.000 | 1
以上是我得到的结果。 Between_Check 列应显示为 0,因为 StartDate 是凌晨 4 点过后一分钟
这是我应该得到的
结果:
ID | StartDate | Midnight | FourAM | Between_Check
------------+-----------------------+-------------------------+-------------------------+--------------
-2135024021 | 19-10-02 00:04:01.000 | 2019-10-02 00:00:00.000 | 2019-10-02 00:04:00.000 | 0
-2135024228 | 19-10-05 00:02:30.000 | 2019-10-05 00:00:00.000 | 2019-10-05 00:04:00.000 | 0
【问题讨论】:
请以文本而非图像形式显示一些示例数据和预期结果 感谢和抱歉格式化。我是***的新手,所以需要积累经验。 '标识 |开始时间 |午夜-2135024021 | 2019-10-02 00:04:01.000 | 2019-10-02 00:00:00.000 |五上午 | BETWEEN_Check 2019-10-02 05:04:01.000 | 1 -2135024020 | 2019-10-01 05:27:25.000 | 2019-10-01 00:00:00.000 | 2019-10-01 10:27:25.000 |1 -2135024020 | 2019-10-01 05:58:43.000 |2019-10-01 00:00:00.000 | 2019-10-01 10:58:43.000 |1 '最后两行应显示 0,因为时间已超过凌晨 5 点。每行以 -213502 开头 请用这些信息更新您的问题,不要发表评论 奇怪的是DATEADD(hh, +4 , DATEDIFF(d, 0, StartTime)) AS FourAM
导致2019-10-02 00:04:00.000
。您的系统必须添加公制小时,每个小时只有一英制分钟。
谢谢哈宝。你的意思是应该是 04:00:00 而不是 00:04:00
【参考方案1】:
如果您想检查时间是否在午夜和凌晨 4 点之间,为什么不简单地使用 datepart(hour, datetime)
IIF (DATEPART(HOUR, StartTime) BETWEEN 0 AND 4, 1, 0)
或者,CONVERT()
StartTime
到 time
数据类型,然后与时间字符串进行比较
IIF (CONVERT(TIME, StartTime) BETWEEN '00:00' AND '04:00', 1, 0)
或
IIF (CONVERT(TIME, StartTime) >= '00:00' AND CONVERT(TIME, StartTime) < '04:00', 1, 0)
不确定您是否希望04:00
具有包容性。无论如何,上面是您可以使用的各种选项
你在这里所做的永远是真实的
IIF(
(StartTime BETWEEN
DATEADD(d, 0, StartTime)
AND DATEADD(hh, +4, StartTime))
, 1, 0)
因为DATEADD(d, 0, StartTime)
基本没有作用,等于StartTime
【讨论】:
谢谢松鼠!在上面显示的情况下,这仍然会导致 1。 StartTime 是 4 点后 1 分钟。您的想法,谢谢!与 GETDATE() 作为 StartTime 一起使用,但不适用于实际的 StartTime,例如我在问题中粘贴的数据。感谢您的时间松鼠。 我明白了,我已将其更改为DATEADD(hh, +4 , DATEDIFF(d, 0, StartTime))
,但我仍然得到相同的结果。完全困扰我。
请更新问题中的示例数据。在 cmets 中不可读
如果需要的逻辑不包含04:00
则改为BETWEEN 0 AND 3
嗨 Squirrl,感谢您的配合。我已经编辑了这个问题。查看结果 :) 希望现在有意义【参考方案2】:
答案在让我查看结果集的 HABO 评论中。
【讨论】:
以上是关于SQL BETWEEN Time 不显示结果的主要内容,如果未能解决你的问题,请参考以下文章
如何在 TIME 数据类型上应用 SQL 'between' 关键字
sql 语句问题,关于BETWEEN AND 和DATE 的