[英]DB2 Convert Number to Date
由于某些原因(我对此无能为力),日期以整数形式存储在我需要查询的iSeries AS400 DB2系统中。 例如今天将存储为:
20,171,221
在英国,我需要它与日期格式类似如下:
21/12/2017
这是从我的查询中得出的:(OAORDT = date字段)
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字段转换为Date?
只是为了更新-我将使用OpenQuery从MS SQL Server查询此信息
谢谢。
1)如何将OAORDT字段转换为Date?
最简单的是使用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。 我喜欢明确地做到这一点。 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'))
提供的格式不是Date字段的格式,而是要转换为Timestamp
的数据的格式。 然后, Date()
函数将Timestamp
值转换为Date
值。 此时格式无关紧要,因为无论您由*DATFMT
指定哪种外部格式,时间戳都采用内部时间戳格式,而日期值采用内部日期格式。 下一次格式很重要,是当您将日期值作为字符串或数字提供给用户时。 在这一点上的格式可以设置为*ISO
, *EUR
, *USA
, *JIS
, *YMD
, *MDY
, *DMY
或*JUL
,并在某些情况下, *LONGJUL
和*Cxxx
格式可供选择。
由于没有任何一种适合我的需求,因此我提出了自己的需求。
它很简单:
select * from yourschema.yourtable where yourdate = int(CURRENT DATE - 1 days) - 19000000;
这days
事情是leap年的,适合大多数需求。
同样的days
可以变成months
或years
。 不需要像VARCHAR_FORMAT
/ TIMESTAMP_FORMAT
这样的重型火炮。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.