【问题标题】:Convert decimal(4,2) to time将十进制(4,2)转换为时间
【发布时间】:2021-06-04 13:17:18
【问题描述】:

我遇到decimal(4,2) 时间值需要转换为time() 的情况。

如果它看起来是唯一的,十进制时间值 14.25 应该是 14:25,而不是 14:15。

我无法更改 CRM 中的数据,因此必须在 SQL Server 中进行所有转换,理想情况下作为表设计器中的计算列规范,但如果只能在 SELECT 语句中实现。

以下是一些示例:

Source Data Needed Result
14.25 14:25
8.09 08:09
10.10 10:10

非常感谢您的阅读。

【问题讨论】:

  • 如何处理像 93.67 这样的值?
  • 源数据按照惯例是 HH.MM ?
  • 您要转换的是小数的字符串表示形式,而不是小数本身。所以需要转换成字符串,替换小数点分隔符,再转换成时间。并希望没有无效值。
  • 我认为普通替换不是您需要的?

标签: sql sql-server database tsql


【解决方案1】:

假设 decimal 只能包含有效的 time 值,您可以这样做:

TIMEFROMPARTS(CONVERT(int,YourColumn),(YourColumn % 1) * 100,0,0,0)

如果可能存在无效值,并且值 NULL 可以接受错误值,例如 24.159.63,那么您可以执行以下操作:

TRY_CONVERT(time(0),REPLACE(CONVERT(varchar(5),YourColumn),'.',':'))

db<>fiddle

其中任何一个都可以用作计算列的表达式,尽管您可能需要在后者中显式提供TRY_CONVERT 的样式代码,使其成为PERSISTED

【讨论】:

  • CAST(REPLACE(CAST([Source data] AS VARCHAR(16)), '.', ':') AS TIME) AS [需要的结果]。 CAST 和 REPLACE 是符合 ANSI 的函数,而 CONVERT、TRY_CONVERT 是 MS SQL 特定的
  • 但是,CAST 与日期(和时间)值并不确定,@SQLpro 因此在计算列中 CONVERTTRY_CONVERT 通常是更好的选择。
  • TRY_CONVERT(time(0),REPLACE(CONVERT(varchar(5),YourColumn),'.',':')) 绝对是我所需要的!谢谢
【解决方案2】:

SET NeededResult = REPLACE(SourceData, '.', ':')

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 2015-03-12
    • 2017-04-18
    • 1970-01-01
    • 2021-07-22
    • 2011-07-09
    • 2014-03-13
    • 2018-01-24
    • 1970-01-01
    相关资源
    最近更新 更多