【问题标题】:SQL Server : filter on time element in datetime formatSQL Server:过滤日期时间格式的时间元素
【发布时间】:2020-01-06 15:42:24
【问题描述】:

我目前正在努力解决以下问题:

我有一个选择datetime 列的SQL 查询。接下来我进行转换以获取时间。

bc.StartTime as startdatetime,
CONVERT(TIME,bc.starttime) as starttime,

输出如下所示:

startdatetime              starttime
-------------------------------------------
2019-04-14 19:13:53.000    19:13:53.0000000
2019-04-15 00:00:00.000    00:00:00.0000000

到目前为止一切顺利,但现在,我想过滤掉“00:00:00.0000000”时间。

我尝试了几种方法,例如:

AND CONVERT (time, bc.starttime) != '00:00:00.0000000' 
AND bc.starttime NOT LIKE '%00:00:00.000'

但它们都不起作用。

starttime 还包含“NULL”——我想保留在我的结果中。

有人可以帮助我吗?

编辑:

感谢大家的贡献!

我有 4 列; actdatetime、bcstarttime、日期和时间。 我会尽量解释我想要什么:

日期和时间列是从 bcstarttime 列转换而来的列。

但我想过滤掉结果中的“00:00:00”时间。 因为该列是别名,所以它不想在我的“WHERE”子句中声明。

如果我执行以下操作:

WHERE bc.StartTime != '00:00:00'

然后它还会“销毁”我的 NULL 值(我想保留在结果中)。

这可能是我忽略的新手......

【问题讨论】:

  • 你能添加一个你的数据表的例子吗?
  • 这将有助于查看您的整个查询不起作用。一种可能的混淆来源是您将 [starttime] 用作原始列名(具有日期部分)和仅时间部分的列别名。您还将时间或日期时间与字符串进行比较,并且显式转换可以更安全,以便您的比较比较相同的类型。否则会发生隐式转换,适用的规则和格式可能不是你所期望的。
  • “它们都没有工作”的调试值为零。你有错误吗?不想要的行被退回?你想要的行被过滤掉了?查询还在运行吗?

标签: sql tsql datetime sql-like


【解决方案1】:

稍微不同的方法怎么样?

where (convert(date, bc.starttime) <> bc.starttime or
       startdatetime is null
      )

也就是说,除了日期组件之外还有其他东西。

或者您可以使用时间来执行此操作:

where (convert(time, bc.starttime) <> '00:00:00.0000000' or
       bc.starttime is null
      )

【讨论】:

  • 嗨,戈登,感谢您的贡献。我试过你的建议。当我使用: WHERE (convert(time,bc.starttime) '00:00:00.000') 它确实是诀窍。但它也为 bc.starttime 删除了我的 NULL。有没有办法保留 NULL 并删除 00:00:00.000 ?
  • @Rob 。 . . or 应该是这样做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多