簡體   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