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

时间:2011-09-07 19:17:20

标签: c# database datetime ibm-midrange

我正在处理来自AS / 400的日期,这是朱利安约会的一种形式。 2000年1月1日以字符串值“1”返回。如果日期是真正的朱利安形式,它将看起来像2000001.日期12/31/2049从AS / 400返回为“49365”。有没有办法在我的C#代码中格式化这些日期看起来像标准的短日期?

4 个答案:

答案 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)
{

}

这是未经测试的,可能需要进行一些更改。但这是我的建议。