2016-09-26 107 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 
相關問題