在DB2中将字符串转换为日期

8

我第一次使用DB2数据库。

我想处理DB2日期,但是数据以字符串形式存储在DB2数据库中。

我希望将此日期字符串转换为实际日期,最好不包括时间,因为我想要在2011年1月1日至2011年1月26日期间的所有交易。

因此,我需要在DB2中使用以下MS SQL语句...

CONVERT(datetime,SETTLEMENTDATE.VALUE,103)

背景说明:我已经做到了

CAST(SETTLEMENTDATE.VALUE, DATE)

AND

DATE(SETTLEMENTDATE.VALUE)

但我需要一位DB2专家的专业知识!

谢谢。


我希望我们的日期在DB2中是字符串...但它们是整数!有6位数字日期(YYMMDD)和8位数字日期(YYYYMMDD)-这是Y2K问题的解决方案!所以在6位数字日期中,值111实际上是2000年1月11日...谈论混乱的转换! - Leslie
你能否发布SETTLEMENTDATE.VALUE列的样本数据? - Harold L
6个回答

24

根据你自己的答案,我猜测你的列的数据格式是这样的:

'DD/MM/YYYY HH:MI:SS'

日期中实际的日、月、年之间的分隔符并不重要,年份后面的任何内容也不会影响结果。

您没有提供所使用的DB2版本或运行平台,因此我假设它在Linux、UNIX或Windows上运行。

几乎任何较新版本的DB2 for Linux/UNIX/Windows(8.2或更高版本,可能甚至包括旧版本),您都可以使用TRANSLATE函数来完成此操作:

select 
   date(translate('GHIJ-DE-AB',column_with_date,'ABCDEFGHIJ'))
from
   yourtable

使用这个解决方案,您的列中日期后面出现什么都无关紧要。

在DB2 9.7中,您还可以使用TO_DATE函数(类似于Oracle的TO_DATE):

date(to_date(column_with_date,'DD-MM-YYYY HH:MI:SS'))

这需要你的数据匹配格式字符串;这样更容易理解,但不像TRANSLATE选项那样灵活。


嗨,Ian,感谢您的答案。我知道肯定有比我做的更好的方法。谢谢! - Fenton

6

我知道这是一篇旧帖子,但我仍然想做出贡献。
如果您的数据格式如下,则上述方法将无法工作:
'YYYMMDD'

例如:

Dt
20151104

所以我尝试了以下方法以获取所需结果。
select cast(Left('20151104', 4)||'-'||substring('20151104',5,2)||'-'||substring('20151104', 7,2) as date) from SYSIBM.SYSDUMMY1;

此外,如果你想从 MS SQL 连接的服务器运行查询到 DB2(仅显示100行)。
    SELECT top 100 * from OPENQUERY([Linked_Server_Name],
    'select cast(Left(''20151104'', 4)||''-''||substring(''20151104'',5,2)||''-''||substring(''20151104'', 7,2) as date) AS Dt 
    FROM SYSIBM.SYSDUMMY1')

上述查询后的结果如下:
Dt
2015-11-04

希望这对其他人有所帮助。

如果你的日期列是以整数数据类型格式化为YYYYMMDD(例如20230522),而不是字符字符串,你也可以执行以下操作:SELECTDATE(TIMESTAMP_FORMAT(CHAR(你的整数日期列),'YYYYMMDD')) AS "DatefromInteger" - FirstFraktal

1
在格式函数中,你可以使用 timestamp_format 函数。例如,如果格式为 YYYYMMDD,则可以这样做:
select TIMESTAMP_FORMAT(yourcolumnchar, 'YYYYMMDD') as YouTimeStamp 
from yourtable

你可以使用此处找到的元素格式here来调整格式。

请注意,如果您的日期列是整数数据类型,例如YYYYMMDD,而不是字符字符串(例如20230522),您需要使用类似以下的语句:SELECT DATE(TIMESTAMP_FORMAT(CHAR(your_int_date_column),'YYYYMMDD')) AS "DatefromInteger" - FirstFraktal

0

好的,看起来有点像是hack。我已经使用了一个子字符串使它能够工作,这样只有包含日期(而不是时间)的字符串部分才会传递到DATE函数中...

DATE(substr(SETTLEMENTDATE.VALUE,7,4)||'-'|| substr(SETTLEMENTDATE.VALUE,4,2)||'-'|| substr(SETTLEMENTDATE.VALUE,1,2))

我仍然会接受比这个更好的答案!


虽然这种特别的做法是可行的,但请参考我已经接受的Ian Bjorhovde的答案! - Fenton

0
请注意,如果您的日期列是一个整数数据类型,例如YYYYMMDD,而不是一个字符字符串(例如20230522),您将需要使用类似以下的方法:
SELECT

    DATE(TIMESTAMP_FORMAT(CHAR(your_int_date_column),'YYYYMMDD'))  AS "DatefromInteger"

-4

你可以使用:

select VARCHAR_FORMAT(creationdate, 'MM/DD/YYYY') from table name

1
我认为他们要求的是字符串转日期,而不是日期转字符串。 - Amir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接