繁体   English   中英

如何格式化yyddd格式的日期没有前导零

[英]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#代码中格式化这些日期看起来像标准的短日期?

2001年1月1日是什么样的?

如果它看起来像“1001”,你可以在左边用零填充到5位数,然后提取2位数年份作为前两位数字和年份数字作为最后3位数。它应该是一个将日期数转换为月和日的简单事项; 如果没有别的,你可以用日期范围内的一堆if语句来做。

如果它看起来像“11”,因为在天数中没有前导零,那么你只是运气不好,因为没有办法区分许多日期,例如2001年1月1日和2000年1月11日。

PS这些不是朱利安日期 ,它们是序数日期的变化。

如果您的日期始终采用'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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM