【问题标题】:How to convert date integer keys into datetime in SQL如何在 SQL 中将日期整数键转换为日期时间
【发布时间】:2020-10-14 14:38:39
【问题描述】:

经过一番挣扎,我无法将 datekey (20200430) 和 timekey (103500) 转换为正确的 datetime (2020-04-30 10:35:00)。我没有加入日期维度的选项,必须使用 SQL 函数转换数字。

我尝试过的:

CONVERT(VARCHAR(10), CAST([datekey] AS DATE),1005) AS DATE_CONVERTED
--this is not yet datetime, but it could be start

我得到的错误是:不允许显式 int 到日期转换。

然后我尝试了这个:

SELECT DATEADD(SECOND, TimeKey, CAST(CAST(DateKey AS VARCHAR(8)) AS DATETIME))

这只是产生了错误的结果。我不知道为什么,但这是错误的。我只想将 datekey 和 timekey 组合到 datetime 中。我的格式是整数的 YYYYMMDD 和 HHMMSS。我需要日期时间。

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案1】:

    SQL Server 允许您将datetime 值相加。因此,您可以分别构造datetime。这是一种方法:

    select (convert(datetime, convert(varchar(255), date_key)) +
            convert(datetime, timefromparts(time_key / 10000, (time_key / 100) % 100, time_key % 100, 0, 0))
           ) as dt
    from (values (20200430, 103500)) v(date_key, time_key);
    

    Here 是一个 dbfiddle。

    【讨论】:

    • 非常感谢戈登。我并不是要贬低您的答案,但是对于这么简单的要求,这不是很复杂吗?我并不是说这不准确或有一个更简单的答案,我是 SQL 新手,这似乎是一个如此基本的问题,我发现很难找到日期时间。你的回答很好,我很惊讶它需要这么复杂的公式才能到达那里。
    • @Julie1995 。 . .如果您有日期/时间键,则应该有提供所需信息的参考表。实际上解析它们似乎是个坏主意。
    • 我的事实表中有 16 个日期,但这意味着加入日期维度 16 次。这似乎是一个更好的解决方案,而不是仅仅为了获得正确的格式而使用 16 个连接。
    • 如果您仍处于设计阶段,请根据秒存储您的时间密钥。 10:35 AM 将是键值 38100(自午夜以来的秒数)。这执行得非常好,不需要加入时间表即可与日期结合。
    • 16 个连接应该没什么大不了的。您的日期表总体上应该很小(又短又瘦)。我的日期维度/事实联接没有任何问题。但是,单个事实中的大量日期可能表明在事实表中混合粒度存在问题。
    【解决方案2】:

    您需要将值转换为明确的格式,然后进行转换。您可以使用STUFF 将所需的:- 字符注入:

    SELECT CONVERT(datetime2(0),STUFF(STUFF(STUFF(STUFF(CONCAT(datekey,'T',RIGHT('000000' + timekey,6)),14,0,':'),12,0,':'),7,0,'-'),5,0,'-'),126)
    FROM (VALUES(20200430,103500))V(datekey,timekey);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      相关资源
      最近更新 更多