DB2 将数字转换为日期



出于某种原因(我无法控制这一点),日期作为整数存储在我需要查询的 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

但是,我得到的只是空值。 如果我删除 Date 函数,那么它确实有效,但它现在是一个字符串,我不想要:

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 查询此内容

谢谢。

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

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

2)在英国,我需要它以日期格式21/12/2017

[...] :
SELECT VARCHAR_FORMAT(DATE(TIMESTAMP_FORMAT(CHAR(OAORDT),'YYYYMMDD')),'DD/MM/YYYY')

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

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

exec sql set option *datfmt = *EUR;

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

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

ctl-opt DatFmt(*ISO);

SQL 日期格式由

exec sql set option *datfmt = *ISO;

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

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

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

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

由于没有一个变体适合我的需求,所以我推出了自己的变体。

它就像:

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

这个days的东西是闰年感知的,适合大多数需求。

同样days可以转向monthsyears. 不需要像VARCHAR_FORMAT/TIMESTAMP_FORMAT这样的重型火炮.

我在使用时也得到了空值

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

CHAR更改为DIGITS让我得到了所需的结果。

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

下面对我有用:

select date(substring(trim(DateCharCol), 1, 2)||'/'||substring(trim(DateCharCol), 3, 2)||'/'||'20'||substring(trim(DateCharCol), 5, 2)) from yourTable where TableCol =?;

相关内容

  • 没有找到相关文章

最新更新