2016-09-26 108 views
0

我有一个名为“EventLog”的表,其名称为nDateTime,其类型为int在SQL Server 2012中将整数值转换为DateTime

这是表“事件日志” 一些值

----------------- 
| nDateTime | 
----------------- 
| 978307200 | 
----------------- 
| 978307219 | 
----------------- 
| 978513562 | 
----------------- 
| 978516233 | 
----------------- 
| 978544196 | 
----------------- 
| 1450379547 | 
----------------- 
| 1472299563 | 
----------------- 
| 1472299581 | 
----------------- 
| 1472300635 | 
----------------- 
| 1472300644 | 
----------------- 
| 1472300673 | 
----------------- 

我需要DateTime值,我尝试了下面的语句,但我收到这些错误:

测试#1:

SELECT CONVERT(DATETIME, CONVERT(CHAR(8), nDateTime), 103) AS 'Formatted date' 
FROM EventLog 

错误说:

Conversion failed when converting date and/or time from character string.

测试#2:从here修改

SELECT CONVERT(DATETIME, nDateTime, 103) AS 'Formatted date' 
FROM EventLog 

而且测试#3云:

SELECT CAST(nDateTime AS datetime) AS 'Formatted date' 
FROM EventLog 

duplicate question不回答我的问题,因为(包括,测试#2和测试#3)产生此错误:

Arithmetic overflow error converting expression to data type datetime.

我承认我从来没有见过像Date这样的价值,为此,我在如何着手中感到困惑。

我的问题是:如何从样本数据中获取有效的DateTime值?

+1

似乎是一个重复:http://stackoverflow.com/questions/7830002/how-to -convert-int-to-date-in-sql-server-2008其中指出:“你不能直接将整数值转换为日期,但你可以先将它转换为日期时间然后再转换为日期类型”...... “'选择强制类型转换(日期时间为40835,日期时间为日期)'”SQL Server 2008 vs 2012版本以外的其他''“ – xQbert

+0

@xQbert我已经检查过这个问题,但出现了”将算术溢出错误转换为数据类型datetime.'。如果我听起来很粗鲁,我的英语不太好_ –

+1

1)“978307200”有9个字符,而不是8个。2)你能否告诉我们数字来自哪里以及它代表什么,例如,从某个日期开始有几毫秒的时间? –

回答

2

几乎所有你看到的表示为整数的日期/时间时,这个数字代表因为已知历元时间的流逝。这是Unix time的基础是,简单地说,因为1st January 1970 00:00:00

使用这个已经过去的秒数,我们可以与您提供

declare @dt DATETIME = '1970-01-01' -- epoch start 
print dateadd(second,978307200,@dt) -- Jan 1 2001 12:00AM 
print dateadd(second,1472300673,@dt) -- Aug 27 2016 12:24PM 

似乎是可能的一些值检查,但谁知道?!

您可以检查只需使用

declare @dt DATETIME = '1970-01-01' -- epoch start 
SELECT 
    nDateTime AS OriginalData, 
    DATEADD(second, nDateTime,@dt) AS ActualDateTime 
FROM EventLog 
-1

你输入> 8位数字,因此它抛出arithmentic溢出错误。如果它是8位,你会得到转换后的数据:

例如:

DECLARE @ndatetime int = 978307200 
SELECT CONVERT(datetime, convert(varchar(10), @ndatetime, 112)) 

- 这将引发算术溢出错误

DECLARE @ndatetime int = 97830720 -- with 8 digits only 
SELECT CONVERT(datetime, convert(varchar(10), @ndatetime, 112)) 

此返回转换后的日期

你可以尝试try_convert这将返回null如果它是错误的日期

DECLARE @ndatetime int = 978307200 
SELECT TRY_CONVERT(datetime, convert(varchar(10), @ndatetime, 112)) 
+0

谢谢你的回答。用你问题中的第二个sql语句:'9783-07-20 00:00:00.000'。我想知道这些值是否真的是日期时间值...例如,如果使用'147402833'代替'97830720',则会出现以下错误:'从字符串中转换日期和/或时间时转换失败。 '。我会编辑我的问题。 –

+0

这个答案只是假设这些数字代表一个日期 - 除非你处理来自9783年的事件日志,我觉得这不太可能。 – Jamiec

+0

你想如何解释日期978307200?你有任何逻辑想法? –

0

只为笑声在你的餐桌每次约会,我参加了一个刺伤具有1970-01-01基准日,但不知道基地,它只是猜测

Declare @Log table (DateInt int) 
Insert Into @Log values 
(978307200), 
(978307219), 
(978513562), 
(978516233), 
(978544196), 
(1450379547), 
(1472299563), 
(1472299581), 
(1472300635), 
(1472300644), 
(1472300673) 

Select DateInt,Converted= DateAdd(SECOND,DateInt,'1970-01-01') From @Log 

返回

DateInt  Converted 
978307200 2001-01-01 00:00:00.000 
978307219 2001-01-01 00:00:19.000 
978513562 2001-01-03 09:19:22.000 
978516233 2001-01-03 10:03:53.000 
978544196 2001-01-03 17:49:56.000 
1450379547 2015-12-17 19:12:27.000 
1472299563 2016-08-27 12:06:03.000 
1472299581 2016-08-27 12:06:21.000 
1472300635 2016-08-27 12:23:55.000 
1472300644 2016-08-27 12:24:04.000 
1472300673 2016-08-27 12:24:33.000 
相关问题