由于某种原因(我无法控制),日期作为整数存储在我需要查询的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查询这个
感谢。
答案 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
更改为months
或years
。
不需要像VARCHAR_FORMAT
/ TIMESTAMP_FORMAT
这样的重型大炮。