Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将14(十四)位bigint数据类型转换为datetime数据类型_Sql_Sql Server_Tsql_Sql Server 2016 - Fatal编程技术网

Sql 将14(十四)位bigint数据类型转换为datetime数据类型

Sql 将14(十四)位bigint数据类型转换为datetime数据类型,sql,sql-server,tsql,sql-server-2016,Sql,Sql Server,Tsql,Sql Server 2016,我有这样的情况: 我有一个14位(不是13位)的bigint数据类型列。 这需要转换为datetime数据类型 例如,必须将20160418074908(bigint)转换为2016-04-18 07:49:08.000(datetime) 我已经通过了很多论坛,但都没有用 有什么建议吗?您需要将它们转换为日期和时间分隔的字符串值,并使用format()函数将bigint时间值格式化为字符串 select cast(cast(cast(left(cast(<date>

我有这样的情况:
我有一个14位(不是13位)的bigint数据类型列。
这需要转换为datetime数据类型

例如,必须将
20160418074908
(bigint)转换为
2016-04-18 07:49:08.000
(datetime)

我已经通过了很多论坛,但都没有用

有什么建议吗?

您需要将它们转换为日期和时间分隔的字符串值,并使用
format()
函数将bigint时间值格式化为字符串

select 
       cast(cast(cast(left(cast(<date> as varchar), 8) as date) as varchar) + ' ' + 
       format(cast(right(cast(<date> as varchar), 6) as int), 
                                  '##:##:##') as datetime) datetimes
from table
您需要将它们转换为日期和时间分开的字符串值,并使用
format()
函数将bigint时间值格式化为字符串

select 
       cast(cast(cast(left(cast(<date> as varchar), 8) as date) as varchar) + ' ' + 
       format(cast(right(cast(<date> as varchar), 6) as int), 
                                  '##:##:##') as datetime) datetimes
from table

一种方法是转换到
char(14)
,然后使用
left
获取日期部分,使用
right
获取时间部分。日期部分可以按原样转换为datetime,因为它是
yyyyMMdd
,但时间部分必须添加
,放在第5和第3位-这就是
东西的作用:

DECLARE @D as bigint = 20160418074908

SELECT CAST(LEFT(CAST(@D as char(14)), 8) AS DATETIME) +
       CAST(STUFF(STUFF(RIGHT(CAST(@D as char(14)), 6), 5, 0, ':'), 3, 0, ':') AS DATETIME)
结果:

2016-04-18 07:49:08
与格式方法相比,这种方法的优势在于速度。
格式
功能不可用


一种方法是转换到
char(14)
,然后使用
left
获取日期部分,使用
right
获取时间部分。日期部分可以按原样转换为datetime,因为它是
yyyyMMdd
,但时间部分必须添加
,放在第5和第3位-这就是
东西的作用:

DECLARE @D as bigint = 20160418074908

SELECT CAST(LEFT(CAST(@D as char(14)), 8) AS DATETIME) +
       CAST(STUFF(STUFF(RIGHT(CAST(@D as char(14)), 6), 5, 0, ':'), 3, 0, ':') AS DATETIME)
结果:

2016-04-18 07:49:08
与格式方法相比,这种方法的优势在于速度。
格式
功能不可用


感谢您提供的帮助:

我在另一个论坛上发现了这个(有点类似于Zohar的):

声明@DateValue varchar(50)=2016041807908

挑选
将(datetime,stuff(stuff(@DateValue,9,0',,12,0',:',,15,0',:'))转换为ConvertedDate

感谢您提供的帮助:

我在另一个论坛上发现了这个(有点类似于Zohar的):

声明@DateValue varchar(50)=2016041807908

挑选
转换(datetime,stuff(stuff(@DateValue,9,0',,12,0',:'),15,0',:'))为ConvertedDate

这是一个转换为数字的字符串。除非将其视为字符串,否则其数字没有任何意义。最简单的方法是将其转换回字符串,然后使用
ParseExact
对其进行解析。您还可以使用模运算来提取单个元素。顺便说一句,一个
DateTime
对象占用相同的空间,8字节。我尝试了无数种方法将14位数字转换为字符串,然后再转换为DateTime;我一次又一次地遇到这个错误:“算术溢出错误,将表达式转换为数据类型datetime。”顺便说一句,T-SQL中的datetime2(0)
比bigint占用的空间要小,只有6个字节,而不是8个字节。这是一个转换为数字的字符串。除非将其视为字符串,否则其数字没有任何意义。最简单的方法是将其转换回字符串,然后使用
ParseExact
对其进行解析。您还可以使用模运算来提取单个元素。顺便说一句,一个
DateTime
对象占用相同的空间,8字节。我尝试了无数种方法将14位数字转换为字符串,然后再转换为DateTime;我一次又一次地遇到这个错误:“将表达式转换为数据类型datetime时出现算术溢出错误。”顺便说一句,T-SQL中的datetime2(0)
比bigint占用更少的空间-只需6个字节,而不是8个字节,将日期部分转换为
datetime
,您就可以添加这些部分了。无需强制转换为date然后varchar然后添加Strings您可以将其缩短为
选择强制转换(左(@date,8)为datetime)+强制转换(格式(右(@date,6)为int),'#:#:###为datetime)为datetime
<代码>左和
隐式地将数字转换为字符串。或者使用
@date%1000000
提取时间部分将日期部分转换为
datetime
,您就可以添加这些部分了。无需强制转换为date然后varchar然后添加Strings您可以将其缩短为
选择强制转换(左(@date,8)为datetime)+强制转换(格式(右(@date,6)为int),'#:#:###为datetime)为datetime
<代码>左和
隐式地将数字转换为字符串。或者使用
@date%1000000
提取时间部分