在SQL Server 2012中将整数值转换为DateTime

时间:2016-09-26 15:40:53

标签: sql-server datetime

我有一个名为" EventLog"其中的列名为 nDateTime ,类型为int

这是表" EventLog" 带有一些值

-----------------
|   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

错误说:

  

从字符串转换日期和/或时间时转换失败。

测试#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)都会产生此错误:

  

将表达式转换为数据类型datetime的算术溢出错误。

我承认我从来没有看到像约会这样的价值,为此,我对如何继续进行了一些困惑。

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

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:-1)

您的输入是> 8位数因此它抛出了算术溢出错误..如果它是8位数,你将得到转换数据:

例如:

fos_user:
    db_driver: orm
    firewall_name: main
    user_class: UserBundle\Entity\User

- 这会引发算术溢出错误

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

这将返回转换日期

您可以尝试try_convert,如果日期错误,将返回null

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