【问题标题】:T-SQL : convert(datetime) to include/exclude certain hoursT-SQL:转换(日期时间)以包括/排除某些时间
【发布时间】:2016-01-18 05:48:33
【问题描述】:

使用日期范围来选择值,但还需要使用小时范围来确定是否应该选择记录。日期范围和时间范围不一定相关。

 game_time (between 6 am and 6 pm)

在语句和日期部分之间直接尝试过,但无法得到任何东西来捕捉我们需要的东西。

create table gametime(name varchar, start_time datetime, end_time datetime)

insert assorted name, start_times and end_times

期望的结果

  name    start_time    end_time
  name1   8:00 AM         10:00 AM
  name2   8:00 AM         11:30 AM
  name3   4:00 PM           5:30 PM
  name4   6:00 PM           9:00 PM

datetime 用于存储,但在演示中不需要.. 在演示中只需要时间。

选定的游戏只能在上午 6:00 到下午 6:00 之间开始。

任何和所有建议和见解都表示赞赏......

使用

LTRIM(RIGHT(CONVERT(VARCHAR(20), start_time, 100), 7)) 

要获得正确的演示格式,

但是当我尝试使用时

LTRIM(RIGHT(CONVERT(VARCHAR(20), start_time, 100), 7)) > 6

我收到转换错误。

【问题讨论】:

  • 需要更多代码——通常你会使用日期时间——你不使用日期时间吗?
  • 请编辑您的问题并提供示例数据和所需结果。目前尚不清楚您真正在寻找什么结果。
  • 是的,使用 current_timestamp。 current_timestamp +.5 选择正确的组,但还需要从早上 6 点到下午 6 点排除那些不在时间范围内的组。
  • 问题已编辑以包含示例数据和所需结果.. 谢谢!!

标签: sql sql-server-2008 tsql date datetime


【解决方案1】:

我会使用DATEPART,而不是依赖于转换/比较字符串:

WHERE DATEPART(hour,start_time) BETWEEN 6 AND 18

【讨论】:

    【解决方案2】:

    在 '06:00' 和 '18:00' 之间尝试 CONVERT(VARCHAR(5),start_time,108)。现在您正尝试将字符串与整数进行比较。

    【讨论】:

    • 感谢您的回复。我将使用 D Stanley 的日期部分,并删除比较,但您的解决方案确实有效..
    【解决方案3】:

    这是另一种方法,前提是您使用的是 SQL Server 2008 或更高版本并且有可用的 TIME 类型:

    SELECT *
    FROM gametime
    WHERE CAST(start_time AS TIME) BETWEEN '06:00:00' and '18:00:00'
    

    当您的时间范围没有固定到确切的小时数时,这可能会更灵活一些。它也是 sarg-able - 即它将使用一个索引,调用 DATEPART 将阻止它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 2022-06-29
      • 2013-02-24
      • 2011-07-29
      • 1970-01-01
      相关资源
      最近更新 更多