将秒转换为小时和分钟

3

我已经阅读了关于将秒转换为小时和分钟的所有StackOverflow帖子。
我正在使用以下语句来实现下面的结果:

SELECT EventDate, OriginalSeconds, 
LEFT(CONVERT(VARCHAR(5),
DATEADD(second, OriginalSeconds, 0), 108), 5)
我得到了以下结果:
EventDate   Seconds     Converted Time  SHOULD BE
01/13/2011  4860001     06:00           13:30
01/13/2011  4860001     06:00           13:30
01/14/2013  3960001     20:00           11:00
02/03/2011  3960001     20:00           11:00
当然,唯一的问题是转换后的时间列没有正确计算。(我已经在应该的列中放置了正确的结果。) 我想这是因为秒数列实际上在末尾有多余的数据。但是 LEFT 函数不是正在修复吗? 我想要实现的是“应该”的那一列。我做错了什么? 我正在寻找一个简单的解决方案,没有函数,但不确定我能否实现。

你没有写这个语句,对吧?因为左边只在那里用于处理计算结果,而不是原始秒字段本身。 - Laurent S.
Bart- 不是的,只是一个简单的复制粘贴的抄袭工作。 - samiboy
2个回答

2

使用您的代码,正确的语句是

SELECT EventDate, OriginalSeconds, 
LEFT(CONVERT(VARCHAR(5),
DATEADD(second, OriginalSeconds/100, 0), 108), 5)

这将为4860001提供13:30。

您需要告诉我们原始OriginalSeconds列中哪部分不是秒数。

DATEADD(second,@secs/100,0)4860001转换为1900-01-01 13:30:00.000

CONVERT(VARCHAR(5),1900-01-01 13:30:00.000,108)将其转换为13:30

Left可能不是必需的。我刚刚尝试了9000001,得到了01:00的结果。因此,该公式将被包装为24小时。


如果不确定数字位数并需要使用LEFT函数,则双重转换应该可以解决问题。+1 - Jayvee
彼得- 太棒了。我甚至没有想到要除以100,而是更担心首先以某种方式编辑字符串。太好了! - samiboy
@user3370701 我只是试图将其分解以理解到底发生了什么...这不是将秒转换为小时的最佳代码。 - Peter M
这比我的方法好,我也没有想到要除以100! - Matt
希望我的客户端应用程序(Microsoft Dynamics CRM在线版)将13:30作为1:30导入。如果我重新将数据导入SQL,那么它应该可以实现,对吧? - samiboy
1
@user3370701 我不知道,但是以每小时100美元的价格,我可以为您调查一下。 - Peter M

0
这个问题和答案对我来说都没有意义,所以我提供了自己的解决方案,它可以将一个整数(表示秒)转换为小时、分钟和秒。 首次尝试 我的解决方案在下面的名为“MySolution”的字段中给出 -
with ORIGINAL_DATA as (

    select
        EventDate, OriginalSeconds
    from (
        values
        ('01/13/2011', 4860001),
        ('01/13/2011', 4860001),
        ('01/14/2013', 3960001),
        ('02/03/2011', 3960001)
    ) as rawData(EventDate, OriginalSeconds)
)

SELECT 
    EventDate, 
    OriginalSeconds, 
    LEFT(CONVERT(VARCHAR(5),DATEADD(second, OriginalSeconds, 0), 108), 5) as SolutionFromQuestion,
    LEFT(CONVERT(VARCHAR(5), DATEADD(second, OriginalSeconds/100, 0), 108), 5) as SolutionFromAnswer,
    LEFT(CONVERT(VARCHAR(8),DATEADD(second, OriginalSeconds, 0), 108), 8) as MySolution,
    (OriginalSeconds / 60) as [Minutes],
    (OriginalSeconds / 60 / 60) as [Hours],
    DATEADD(second, OriginalSeconds, 0) as [Timestamp by adding OriginalSeconds to 0]
from ORIGINAL_DATA
;
这将产生以下结果 -

enter image description here

讨论

所有的回答 - 问题、被接受的答案和我的答案 - 都使用了代码DATEADD(second, OriginalSeconds, 0)。这段代码从"零日期"开始,然后加上我们感兴趣的秒数(OriginalSeconds)。

我只将这段代码放在了最后一列。从最后一列的结果可以看出,用这种方式计算得到的日期是1900年2月,也就是说OriginalSeconds相当于超过30天的时间。

我还简单地将OriginalSeconds整数除以60,以显示我们应该期望的分钟数(Minutes),然后再除以60,以显示我们应该期望的小时数(Hours)。很明显,这些OriginalSeconds整数对应着每个超过1,000小时的时间...所以当问题说期望的值是"13:30"时,我真不知道它在说什么。问题要求的是小时和分钟。正确的值应该像1350:00这样。

按照接受的答案的方法,但将字符串扩展到8个字符,可以得到小时、分钟和秒。我的解决方案显示了与问题中类似的值,但包括了秒的部分,即"06:00:01" - 这是计算出来的日期时间的时间部分,但忽略了整天的部分...所以从技术上讲这仍然不正确。就像我说的,正确的答案应该在某些行中显示1,350小时。

最终解决方案

最终解决方案提供以下内容:

  • 将表示秒的整数转换为:
    • 天、小时、分钟、秒
    • 小时、分钟、秒

请参见以下列:

  • FinalSolutionWithDays
  • FinalSolutionWithoutDays

以下是代码:

with ORIGINAL_DATA as (

    select
        EventDate, OriginalSeconds
    from (
        values
        ('01/13/2011', 4860001),
        ('01/13/2011', 4860001),
        ('01/14/2013', 3960001),
        ('02/03/2011', 3960001)
    ) as rawData(EventDate, OriginalSeconds)
)

select
    EventDate,
    OriginalSeconds,
    LEFT(CONVERT(VARCHAR(8),DATEADD(second, OriginalSeconds, 0), 108), 8) as TimePart,

    DATEADD(second, OriginalSeconds, 0) as FullTimestamp,

    datediff(day, 0, DATEADD(second, OriginalSeconds, 0)) as DaysPart,

    cast(
        datediff(day, 0, DATEADD(second, OriginalSeconds, 0)) -- days part
        as varchar(32)
        )
    + ' days ' 
    + LEFT(CONVERT(VARCHAR(8),DATEADD(second, OriginalSeconds, 0), 108), 8) -- time part
    as FinalSolutionWithDays,

    datediff(hour, 0, DATEADD(second, OriginalSeconds, 0)) as HoursTotal,

    right(LEFT(CONVERT(VARCHAR(8),DATEADD(second, OriginalSeconds, 0), 108), 8), 5) as MinutesAndSeconds,

    cast(
        datediff(hour, 0, DATEADD(second, OriginalSeconds, 0)) -- HoursTotal
        as varchar(32))
    + ':'
    + right(LEFT(CONVERT(VARCHAR(8),DATEADD(second, OriginalSeconds, 0), 108), 8), 5) -- MinutesAndSeconds
    as FinalSolutionWithoutDays

from ORIGINAL_DATA
这是结果:

enter image description here

再说一遍...我不知道自己是不是离开了地球,因为其他人似乎都知道他们在说什么,但是我认为如果你想将表示秒数的整数转换成小时和分钟等,你应该看到像我在这里给出的答案一样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,