我正在处理来自AS / 400的日期,这是朱利安约会的一种形式。 2000年1月1日以字符串值“1”返回。如果日期是真正的朱利安形式,它将看起来像2000001.日期12/31/2049从AS / 400返回为“49365”。有没有办法在我的C#代码中格式化这些日期看起来像标准的短日期?
答案 0 :(得分:3)
2001年1月1日是什么样的?
如果它看起来像“1001”,你可以在左边用零填充到5位数,然后提取2位数年份作为前两位数字和年份数字作为最后3位数。它应该那么将一年的数字转换为一个月和一天是一件简单的事情;如果没有别的,你可以在日期范围内用一堆if
语句来做。
如果它看起来像“11”,因为当天没有前导零,你就是运气不好,因为没有办法区分许多日期,例如2001年1月1日和2000年1月11日
P.S。这些不是Julian dates,它们是ordinal dates的变体。
答案 1 :(得分:2)
IF 您的日期始终采用'yyddd'格式:
如果您可以直接编写SQL语句,则以下内容将起作用...
SELECT CAST('20' || julianDate as date)
FROM table
如果不这样做,请考虑编写一个包含该行为的视图(这是视图存在的原因之一......)。
由于显而易见的原因,所有日期都将被视为2000年及以后......
IF (无论出于什么原因)它会删除每个部分中的任何前导零(正如@ Anomie的回答中的评论所指出的),你确实只是敬酒。坦率地说,整个数据集可能是一个损失,因为我不确定RPG在这一点上是否能够正确区分某些日期。
答案 2 :(得分:2)
IBM将* JUL日期格式定义为 yy / ddd 。它不常用,但是AS / 400支持可用的标准格式。你说你有一个字符串,所以这里的假设是它在DDS中存储为CHAR(5)或5A。
如果您的列名为 jdt ,请在SQL中使用以下字符获取正确的数字位数:
RIGHT(('00000' || TRIM(jdt)),5)
现在把斜杠放在:
INSERT( RIGHT(('00000'||TRIM(jdt)),5) ,3,0,'/')
DB2 / 400可以将其强制转换为实际日期字段,但只有SET OPTION DATFMT=*JUL
才能正常工作。如何在Windows上使用C#进行此操作取决于您的连接方式。
假设您无法找到在连接上设置日期格式的方法。
解决方案:在DB2中创建用户定义函数[UDF]。
首先,选择适当的库来存储函数,并将其设置为当前库。在OS / 400 CL,CHGCURLIB yourlib
或SQL中,SET SCHEMA = yourlib
。因此,默认情况下,您创建的任何内容都将进入此库。
我建议将UDF的SQL定义存储在源成员中。 (询问是否不熟悉)您可以使用RUNSQLSTM
命令执行源。
您的函数定义可能如下所示:
CREATE FUNCTION CvtJul2Date( jdtin char(5) ) RETURNS DATE
LANGUAGE SQL
SPECIFIC CVTJUL2DT
DETERMINISTIC NO EXTERNAL ACTION
CONTAINS SQL
RETURNS NULL ON NULL INPUT
SET OPTION DATFMT = *JUL
BEGIN
RETURN(
date( insert( right(('00000'||trim(jdtin)),5) ,3,0,'/') )
);
END
* JUL选项的作用域是UDF。无论作业的DATFMT如何(假设您已将此函数放在该作业的库列表中的库中),在AS / 400上运行的任何SQL查询都应该能够执行此转换。
答案 3 :(得分:1)
哎呀...我的坏。仍然可能必须编写一种方法。
根据您的描述,增加1是新的一天?看起来你必须做一些数学来计算日期。也许创建一个像
这样的函数public DateTime ConvertDate(int julianDate)
{
}
这是未经测试的,可能需要进行一些更改。但这是我的建议。