[英]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.