DB2将数字转换为日期

时间:2017-12-21 16:19:53

标签: sql date db2 ibm-midrange

由于某种原因(我无法控制),日期作为整数存储在我需要查询的iSeries AS400 DB2系统中。例如。今天将存储为:

20,171,221

在英国,我需要它像日期格式中的下面一样:

21/12/2017

这是我的查询:(OAORDT =日期字段)

Select
Date(SUBSTR( CHAR( OAORDT ),7,2) ||'/' || SUBSTR(CHAR ( OAORDT ),5,2) || '/' || SUBSTR(CHAR (OAORDT ),1,4)) AS "Order Date"
from some.table

但是,我得到的只是Nulls。如果我删除了日期功能,那么它确实有效但它现在是一个我不想要的字符串:

Select
SUBSTR( CHAR( OAORDT ),7,2) ||'/' || SUBSTR(CHAR ( OAORDT ),5,2) || '/' || SUBSTR(CHAR (OAORDT ),1,4) AS "Order Date"
from some.table

如何将OAORDT字段转换为日期?

只是为了更新 - 我将使用OpenQuery从MS SQL Server查询这个

感谢。

3 个答案:

答案 0 :(得分:5)

1)如何将OAORDT字段转换为日期?
  最简单的方法是使用TIMESTAMP_FORMAT

SELECT DATE(TIMESTAMP_FORMAT(CHAR(OAORDT),'YYYYMMDD'))

2)在英国,我需要以[...]日期格式[{1}}:

21/12/2017

答案 1 :(得分:1)

请注意,您没有指定执行此操作的位置,但由于您标记为ibm-midrange,我正在回答嵌入式SQL。如果您需要JDBC,ODBC或交互式SQL,这个概念是相似的,只是实现它的方法是不同的。

确保SQL以正确的格式使用日期,默认为*ISO。对你来说应该是*EUR。在RPG中,你可以这样做:

exec sql set option *datfmt = *EUR;

确保set option是程序中的第一个SQL语句,我通常会立即将它放在D和C规范之间。

注意这不是程序的最佳解决方案。最佳做法是将RPG和SQL日期格式都设置为* ISO。我喜欢明确地这样做。 RPG日期格式由

设置
ctl-opt DatFmt(*ISO);

SQL日期格式由

设置
exec sql set option *datfmt = *ISO;

现在所有内部日期都以* ISO格式处理,并且没有年份范围限制(年份可以是0001 - 9999)。您可以以任何格式显示或打印。同样,您可以以任何格式接收输入。

编辑日期是一个独特的野兽。并非每种语言,OS都知道如何处理它们。如果要查找日期值,则需要指定的唯一格式是要转换为日期的字符串格式。您不需要(不能)指定日期字段的内部格式,日期字段的外部格式可以是您想要的任何内容,每次使用时都不同。所以当你使用TIMESTAMP_FORMAT()作为@ Stavr00时提到:

DATE(TIMESTAMP_FORMAT(CHAR(OAORDT),'YYYYMMDD'))

提供的格式不是日期字段的格式,而是转换为Timestamp的数据格式。然后Date()函数将Timestamp值转换为Date值。此时格式无关紧要,因为无论*DATFMT指定了哪种外部格式,时间戳都采用内部时间戳格式,日期值采用内部日期格式。下一次格式重要的是当您将Date值作为字符串或数字呈现给用户时。此时,格式可以设置为*ISO*EUR*USA*JIS*YMD*MDY*DMY ,或*JUL,在某些情况下*LONGJUL*Cxxx格式可用。

答案 2 :(得分:0)

由于所有变体都不符合我的需求,因此我提出了自己的变体。

这很简单:

select * from yourschema.yourtable where yourdate = int(CURRENT DATE - 1 days) - 19000000;

days可以识别leap年,并且适合大多数需求。

可以将days更改为monthsyears。 不需要像VARCHAR_FORMAT / TIMESTAMP_FORMAT这样的重型大炮。