[英]How to format dates in format yyddd having no leading zeros
我正在处理来自AS / 400的日期,这是朱利安日期的一种形式。 2000年1月1日以字符串值“1”返回。 如果日期是真正的朱利安形式,它将看起来像2000001.日期12/31/2049从AS / 400返回为“49365”。 有没有办法在我的C#代码中格式化这些日期看起来像标准的短日期?
如果您的日期始终采用'yyddd'格式:
如果您可以直接编写SQL语句,以下内容将起作用...
SELECT CAST('20' || julianDate as date)
FROM table
如果不这样做,请考虑编写一个包含该行为的视图(这是视图存在的原因之一......)。
出于显而易见的原因,所有日期都将被视为2000年及以后......
如果 (无论出于什么原因)它正在删除每个部分中的任何前导零(正如@ Anomie的答案中的评论所指出的那样),你确实只是敬酒。 坦率地说, 整个数据集可能是一个损失,因为我不确定RPG在这一点上是否能够正确区分某些日期。
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查询都应该能够执行此转换。
糟糕...我的坏。 仍然可能必须编写一种方法。
根据您的描述,增加1是新的一天? 看起来你必须做一些数学来计算日期。 也许创建一个像
public DateTime ConvertDate(int julianDate)
{
}
这是未经测试的,可能需要进行一些更改。 但这是我的建议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.