我有一个名为" 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值?
答案 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))