2014-02-27 44 views
0

我有一個自帶數據庫的應用程序,在該配置上我無法更改任何內容。但是,我們從數據庫中提取數據以生成報告。在SQL查詢中將自定義數值日期值轉換爲實際日期

出於某種原因(我還是不太懂),應用程序保存日期,號碼爲:

numdate = (int) '1' & <last two digits of year> & <zero-leading month> & <zero-leading day> 

如:

08/10/2008 -> 1081008 
01/01/2014 -> 1140101 
27/02/2014 -> 1140227 

現在我只是拉在數並將其轉換爲實際日期。

是否有可能通過SQL查詢以某種方式進行此轉換?

+1

你正在使用哪個數據庫? –

+0

您的示例與您的定義不符。你的定義是1yymmdd,但例子是1ddmmyy。 –

+0

@NikhilButani微軟SQL服務器,通過odbc連接 –

回答

1

如果它的SQL Server,以下應該工作:

DECLARE @dateInt INT = 1981008 
SELECT CONVERT(DATETIME, SUBSTRING(CONVERT(VARCHAR, @dateInt), 2, 6), 12) 

爲了節省您的閱讀評論,Gunther通過刪除子字符串操作來改善性能,以減少:

SELECT CONVERT(DATETIME, CONVERT(VARCHAR,@dateInt-1000000), 12) 
+0

子串不會接受數字輸入;如果我首先將所有內容都轉換爲字符串,它仍然是高性能的嗎? –

+0

我改變了使用INT的代碼。這在我的系統上非常快。我相信你將不得不轉換爲一個字符串,因爲沒有INT-> DATETIME轉換(至少在我所知的T-SQL中是這樣)。此操作*對性能的影響要遠遠小於IO和其他關係操作。 –

+0

我試過'convert(datetime,numdatecolumn-1000000,12)'但它給了錯誤的日期,我猜確實需要字符串轉換,但是我只是通過減去1e6而忽略了子字符串。謝謝! –

1

如果您使用的是C#,則可以使用它。

string dateString = "1981008"; 
      DateTime dt; 
      DateTime.TryParseExact(dateString.Remove(0,1), "yyMMdd", null, System.Globalization.DateTimeStyles.None, out dt); 

在SQL(假設它是MS SQL),試試這個:

convert(datetime,'981008',112)