【问题标题】:Get HH:MM:SS from a datetime in MSSQL从 MSSQL 中的日期时间获取 HH:MM:SS
【发布时间】:2020-11-30 01:07:18
【问题描述】:

我有以下问题:

我有一个日期时间字段,其中包含如下条目:“1970-01-01 22:09:26.000”

我只想提取 22:09:26 (hh:mm:ss) 部分,但我无法将其转换为 24h 格式,我使用了 FORMAT 和 CONVERT,但收到了 am/pm 文化(对于 CONVERT,我尝试使用 13 文化值)。

构造公式以返回上述格式的最简单方法是什么?

谢谢!

【问题讨论】:

  • 您在哪里显示这些数据?这种格式通常会在您的表示层中处理。
  • 为什么不把CONVERT你的数据转移到timetime(0)因为你不想要任何毫秒),因为你只是在时间部分之后?
  • 注意formattime(0)format 不会舍入您的秒数,而time(0) 会。 time 的值 12:00:12.7566667 将在转换为 time(0) 时输出 12:00:13,但在使用 format 时输出 12:00:12

标签: sql-server type-conversion format


【解决方案1】:

要仅获取datetimetime 部分,您只需要将castconvert 转换为适当的数据类型。如果您真的想在查询中直接格式化您的数据,format 很有可能做到这一点,但我不确定您在那里遇到了什么问题:

declare @t table(d datetime);
insert into @t values(dateadd(minute,-90,getdate())),(dateadd(minute,-60,getdate())),(dateadd(minute,-30,getdate())),(dateadd(minute,90,getdate()));

select d
      ,cast(d as time) as TimeValue
      ,format(d,'HH:mm:ss') as FormattedTimeValue
from @t;

输出

+-------------------------+------------------+--------------------+
|            d            |    TimeValue     | FormattedTimeValue |
+-------------------------+------------------+--------------------+
| 2020-08-10 11:51:15.560 | 11:51:15.5600000 | 11:51:15           |
| 2020-08-10 12:21:15.560 | 12:21:15.5600000 | 12:21:15           |
| 2020-08-10 12:51:15.560 | 12:51:15.5600000 | 12:51:15           |
| 2020-08-10 14:51:15.560 | 14:51:15.5600000 | 14:51:15           |
+-------------------------+------------------+--------------------+

【讨论】:

  • 嗨,我检查了源,在“Main_table”中,“datetimefield”是 datettime 类型,我的问题是,当我使用以下公式时,我的结果将是:SELECT datetimefield as d, FORMAT(datetimefield,'hh:mm:ss') as dFORMAT, CAST([datetimefield as time) as dCAST, CONVERT(time,datetimefield) as dCONVERT from Main_table with (nolock) d -> 1970-01-01 22:09 :26.000 dFORMAT -> 10:09:26 dCAST -> 22:09:26.0000000 dCONVERT -> 22:09:26.0000000
  • @mpataki 您应该阅读format 选项的工作原理。 hh 是 12 小时格式,HH 是 24 小时格式。因为你使用了hh,所以你得到的是10而不是22。请改用HH
【解决方案2】:

第一种方式 您可以从https://www.mssqltips.com/sqlservertip/1145/date-and-time-conversions-using-sql-server/中选择您想要的格式

select replace(convert(nvarchar(20), CAST('1970-01-01 22:09:26.000' AS datetime), 114),'-',':')

第二种方式 这不是转换,但如果您的条目都是相同的格式,那么您可以使用以下内容:

select right('1970-01-01 22:09:26.000',12)

如果您也有空日期,则更新:

1.

select case when value is not null
        then replace(convert(nvarchar(20), CAST(value AS datetime), 114),'-',':')
            else null
       end
select case when value is not null then right(value,12)
     else null end

【讨论】:

  • 遗憾的是,由于我有 NULL,它们无法正常工作:在第一种情况下,我得到了毫秒的结果,在第二种情况下,由于 AM/PM en-us 文化,我得到了如下结果:1970凌晨 2 点 12 分
  • 当它为null时,你想让它为null吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多