[英]Sql Datetime convert
在數據庫表中,我有兩列以這種格式存儲日期和時間:
D30DAT D30TIM
140224 75700
我需要更新一個新字段,其中存儲日期的格式為
2014-02-24 07:57:00.000
如何使用SQL查詢來做到這一點?
試試這個功能。 它不是特別快或很棒,但是可以轉換您指定的字段。
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
如果您需要有關更新聲明的幫助,請告訴我
因為有人在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;
這會將數字轉換為YYMMDD HH:MM:SS
格式,SQL Server將該格式識別為日期/時間值。 實際上,最好在四位數的年份前加上“ 20”,但是我不確定OP在Y2K可轉換性方面想要什么。
盡管代碼看起來有些不同,但是類似的邏輯在大多數數據庫中都可以使用。
對於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;
如果時間部分僅由5位數字組成,則case
表達式將添加前導0
,以便可以始終為小時指定2位數字的格式掩碼。 兩列之間的空白本質上僅是調試輔助,可以省略。
結果是一個真實的時間戳值,可以使用to_char()
輕松將其格式化為所需的格式。
適用於Postgres的SQLFiddle: http ://sqlfiddle.com/#!15/ac07a/2
適用於Oracle的SQLFiddle: http ://sqlfiddle.com/#!4/ac07a2/4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.