Sql日期时间转换

Sql日期时间转换,sql,date,Sql,Date,在数据库表中,我有两列以这种格式存储日期和时间: D30DAT D30TIM 140224 75700 我需要更新一个新字段,其中存储格式为 2014-02-24 07:57:00.000 如何使用SQL查询来完成此操作 试试这个功能。它不是特别快或伟大,但转换您指定的字段 CREATE FUNCTION GetDateTimeFromINT ( @Date INT, @Time INT ) RETURNS DATETIME AS BEGIN DECLAR

在数据库表中,我有两列以这种格式存储日期和时间:

   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

如果您需要有关update语句的帮助,请告诉我

,因为有人在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识别为日期/时间值的格式
yymmd HH:MM:SS
。事实上,为四位数的年份预支“20”会更好,但我不确定OP在Y2K可兑换性方面想要什么

虽然代码看起来有点不同,但类似的逻辑在大多数数据库中都适用。

对于Postgres和Oracle(假设这些列是varchar):

如果时间部分仅由5位数字组成,则
大小写
表达式会添加一个前导的
0
,以便可以为小时指定始终为2位的格式掩码。两列之间的空白基本上只是一个调试帮助,可以省略。

结果是一个真实的时间戳值,可以使用
to_char()
轻松地将其格式化为所需的格式

SQLFiddle for Postgres:

SQLFIDLE for Oracle:

您使用的是哪种DBMS?博士后?Oracle?您的列是什么数据类型?使用
D30TIM
,我看到
07:57:00
表示为
75700
。分钟元素是否总是由两位数字组成?小时部分显然不存在t@MartinParkin-你真的希望如此,不是吗-否则,
11300
是几点?1点13分还是11点3分?@Damien_不信者是的,这确实让我担心!我假定这些值存储在数字列中,因此前导的0将从hourNice中删除,但我更愿意使用yyyy-MM-dd格式作为日期,而不是使用月份名称的缩写,因为这可能会在其他语言设置中导致问题。它还使函数变得更简单。仍然需要关于正在使用的数据库类型的答案,尽管。。。
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;