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() StartTimetime 数据类型,然后与时间字符串进行比较

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 查询返回不正确的结果

SQL between and 日期范围 筛选数据不符

sql 语句问题,关于BETWEEN AND 和DATE 的

SQL Server 查询使用 BETWEEN 过滤器带来不匹配的数据

SQL中如何显示COUNT结果为0的行