在數據庫表中,我有兩個列存儲日期和時間格式爲:的Sql時間值轉換
D30DAT D30TIM
140224 75700
我需要更新一個新的領域,其中存儲日期格式
2014-02-24 07:57:00.000
如何我可以使用SQL查詢來做到這一點?
在數據庫表中,我有兩個列存儲日期和時間格式爲:的Sql時間值轉換
D30DAT D30TIM
140224 75700
我需要更新一個新的領域,其中存儲日期格式
2014-02-24 07:57:00.000
如何我可以使用SQL查詢來做到這一點?
對於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
試試這個功能。它不是特別快或很棒,但會轉換您指定的字段。
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
如果您需要的更新語句的幫助,讓我知道
不錯,但我寧願使用yyyy-MM-dd格式作爲日期而不是使用月份名稱的縮寫,因爲這可能會導致其他語言環境中的問題。它也使該功能更簡單一些。仍然需要一個正在使用的數據庫類型的答案,但... – Tom
因爲有人在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可兌換性方面需要什麼。
雖然代碼看起來有點不同,但類似的邏輯可以在大多數數據庫中工作。
哪些DBMS您使用的? Postgres的?甲骨文? –
什麼**數據類型**是你的列? –
對於'D30TIM',我發現'07:57:00'表示爲'75700'。分鐘元素是否總是由兩位數組成?小時組件顯然不是 –