【问题标题】:Why I am not allowed to convert data type decimal to time?为什么我不允许将数据类型十进制转换为时间?
【发布时间】:2021-10-01 14:41:11
【问题描述】:

我有一张时间表。在这里面我有一个专栏arrival_time 这是一个decimal

以下是一些示例值:

arrival_time
6.23
6.58
5.51

所以6.23 是 6 小时 23 分钟。

我想将sum 的值设为time 而不是decimal

所以我尝试了这个

datediff(hour,min(cast(arrival_time as time)),max(cast(arrival_time as time))),

我得到了这个错误

Explicit conversion from data type decimal to time is not allowed.

我没有找到如何转换类型然后对值求和。

我做错了什么?

【问题讨论】:

  • 假设 6.23 小时是 6 小时 13.8 分钟。 6.85是几点?为什么不使用time 数据类型存储时间?
  • 如果那是 SQL Server,那就没有意义了。 time 表示一天中的时间。将一天中的两次加在一起是没有意义的(因此不支持)。你需要一个代表时间span的东西,最明智的存储方式通常是一个整数,计算你想要使用的最小单位(例如分钟),然后自然支持加法。跨度>
  • 对不起。我添加了 RDBMS。 @Stu 因为我从软件中获取了这些数据,但我无法更改数据库结构。
  • 人们有时将时间存储为小数,但它是 十进制,即6.25 是 6 点后 15 分钟,6.50 是 6 点后 30 分钟. 这种格式特别奇怪,提示输入'6.25' 的varchar 而不是小数。那么,separate the fraction 并声明它为分钟,并将所有这些添加到零日期。
  • @LouisChopard - 如果时间总和大于 24 小时,你想要什么格式?

标签: sql sql-server


【解决方案1】:

我将把它放在这里作为一个想法。您可以使用 CAST(col AS INT) 函数来撬出小数点两侧的值。

IF OBJECT_ID('TEMPDB..#TEMP') IS NOT NULL
    DROP TABLE #TEMP

CREATE TABLE #TEMP (
    arrival_time                DECIMAL(4,2)
)
INSERT INTO #TEMP (arrival_time)
VALUES (6.23)
    ,(6.58)
    ,(5.51)

SELECT 
    arrival_time
    ,CAST(arrival_time AS INT) [Hours]
    ,CAST(arrival_time AS INT)*60 [Hours in Minutes]
    ,(arrival_time - CAST(arrival_time AS INT))*100 [Decimal Minutes]
    ,((CAST(arrival_time AS INT)*60)+(arrival_time - CAST(arrival_time AS INT))*100) [Put them together for total minutes]
    --You can use the last column for a dateadd equation if you have a start date.
FROM #TEMP

输出如下:

【讨论】:

  • 这正是我想做的。谢谢
猜你喜欢
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 2016-05-09
  • 2013-04-27
相关资源
最近更新 更多