出于某种原因(我无法控制这一点),日期作为整数存储在我需要查询的 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
可以转向months
或years
. 不需要像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 =?;