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;