簡體   English   中英

SQL Datetime轉換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM