2015-06-19 24 views
0

在數據庫表中,我有兩個列存儲日期和時間格式爲:的Sql時間值轉換

D30DAT D30TIM 
    140224 75700 

我需要更新一個新的領域,其中存儲日期格式

2014-02-24 07:57:00.000 

如何我可以使用SQL查詢來做到這一點?

+5

哪些DBMS您使用的? Postgres的?甲骨文? –

+2

什麼**數據類型**是你的列? –

+0

對於'D30TIM',我發現'07:57:00'表示爲'75700'。分鐘元素是否總是由兩位數組成?小時組件顯然不是 –

回答

0

對於Postgres的和Oracle(假設這些列是VARCHAR):

select to_timestamp(dt, 'yymmdd hh24miss') 
from (
    select d30dat||' '||case when length(d30tim) = 5 then '0'||d30tim else d30tim end as dt 
    from x 
) t; 

case表達增加了一個龍頭0如果時間部分僅由5位數字,使得格式掩碼可以總是2指定小時的數字。兩列之間的空白基本上只是一個調試幫助,可以省略。

結果是一個實際時間戳值,可以很容易地使用to_char()格式化爲所需的格式。

SQLFiddle Postgres的:http://sqlfiddle.com/#!15/ac07a/2
SQLFiddle對於Oracle:http://sqlfiddle.com/#!4/ac07a2/4

0

試試這個功能。它不是特別快或很棒,但會轉換您指定的字段。

CREATE FUNCTION GetDateTimeFromINT 
(
    @Date INT, 
    @Time INT 
) 
RETURNS DATETIME 
AS 
BEGIN 
DECLARE @YearNo VARCHAR(4) 
DECLARE @MonthNo VARCHAR(3) 
DECLARE @DayNo VARCHAR(2) 
DECLARE @HourNo VARCHAR(2) 
DECLARE @MinNo VARCHAR(2) 
DECLARE @SecNo VARCHAR(2) 

SET @YearNo = LEFT(CONVERT(VARCHAR,@Date), LEN(@Date)-4) 
SET @MonthNo = SUBSTRING(CONVERT(VARCHAR,@Date),LEN(@Date)-3,2) 
SET @DayNo = SUBSTRING(CONVERT(VARCHAR,@Date),LEN(@Date)-1,2) 

SET @HourNo = LEFT(CONVERT(VARCHAR,@Time), LEN(@Time)-4) 
SET @MinNo = SUBSTRING(CONVERT(VARCHAR,@Time),LEN(@Time)-3,2) 
SET @SecNo = SUBSTRING(CONVERT(VARCHAR,@Time),LEN(@Time)-1,2) 

SET @YearNo = '20' + @YearNo 
IF LEN(@HourNo) = 1 
BEGIN 
    SET @HourNo = '0' + @HourNo 
END 

SET @MonthNo = CASE 
        WHEN @MonthNo = '01' THEN 'JAN' 
        WHEN @MonthNo = '02' THEN 'FEB' 
        WHEN @MonthNo = '03' THEN 'MAR' 
        WHEN @MonthNo = '04' THEN 'APR' 
        WHEN @MonthNo = '05' THEN 'MAY' 
        WHEN @MonthNo = '06' THEN 'JUN' 
        WHEN @MonthNo = '07' THEN 'JUL' 
        WHEN @MonthNo = '08' THEN 'AUG' 
        WHEN @MonthNo = '09' THEN 'SEP' 
        WHEN @MonthNo = '10' THEN 'OCT' 
        WHEN @MonthNo = '11' THEN 'NOV' 
        WHEN @MonthNo = '12' THEN 'DEC' 
       END 

RETURN CONVERT(DATETIME, @DayNo + '-' + @MonthNo + '-' + @YearNo +' ' + @HourNo + ':' + @MinNo + ':' + @SecNo) 
END 
GO 

調用它像這樣:

SELECT *, dbo.GetDateTimeFromINT(D30DAT,T30DAT) OutputDT 
FROM SourceTable 

如果您需要的更新語句的幫助,讓我知道

+1

不錯,但我寧願使用yyyy-MM-dd格式作爲日期而不是使用月份名稱的縮寫,因爲這可能會導致其他語言環境中的問題。它也使該功能更簡單一些。仍然需要一個正在使用的數據庫類型的答案,但... – Tom

0

因爲有人在SQL Server中一個令人費解的答案,我想指出有一個更簡單的方法。

我也想指出格式不是不合理的。它可以輕鬆訪問日期部分,並且可以排序。當然,真正的日期/時間值也具有這些屬性;我猜測這是一些古老系統的遺留格式。

在任何情況下,試試這個:

with t as (select 140224 as ymd, 75700 as hms) 
select cast(cast(ymd as varchar(255)) + ' ' + 
      stuff(stuff(right('000000' + cast(hms as varchar(255)), 6 
          ), 3, 0, ':' 
         ), 6, 0, ':') 
from t; 

這會把數字成SQL Server識別爲一個日期/時間值的格式YYMMDD HH:MM:SS。事實上,預計四位數年份的「20」會更好,但我不確定OP在Y2K可兌換性方面需要什麼。

雖然代碼看起來有點不同,但類似的邏輯可以在大多數數據庫中工作。