SQL 如何将日期整数键转换为日期时间
How to convert date integer keys into datetime in SQL
经过一番努力,我无法将 datekey (20200430) 和 timekey (103500) 转换为正确的日期时间 (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 服务器允许您将 datetime
个值相加。因此,您可以分别构造 date
和 time
。这是一种方法:
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 是一个 db<>fiddle.
您需要将数值转为无歧义的格式,然后进行转换。您可以使用 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);
经过一番努力,我无法将 datekey (20200430) 和 timekey (103500) 转换为正确的日期时间 (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 服务器允许您将 datetime
个值相加。因此,您可以分别构造 date
和 time
。这是一种方法:
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 是一个 db<>fiddle.
您需要将数值转为无歧义的格式,然后进行转换。您可以使用 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);