2012-11-19 32 views
0

我在某個數據庫的自由,它將日期值存儲爲整數(即​​20121119)。我有幾個查詢爲報告顯示檢索這些值,所以我需要將這些值轉換爲m/d/yyyy格式。有沒有一種快速的方法來重新格式化ColdFusion查詢列中的所有值?

我看到幾個方法可以做到這一點:

  • 做轉換的顯示,使用現有的全球UDF。這裏的缺點是,如果查詢被重用,我需要複製轉換顯示值所需的代碼。
  • 解析SQL中的值以返回格式正確的值。我正在從DB2/iSeries中讀取數據,該數據庫沒有(據我發現)有一個內置函數。
  • 遍歷結果集並一次轉換一個值。這是我目前在做什麼,但是對於更大的數據集,性能是一個問題:

    <cfscript> 
        var i = 1; 
        var _query = ARGUMENTS.query; 
    
        if ( !Len(Trim(ARGUMENTS.column)) 
         || !ListFindNoCase(_query.ColumnList, ARGUMENTS.column)) 
         return _query; 
    
        for (i=1; i<=_query.RecordCount; i++) { 
         _query[ARGUMENTS.column][i] = 
          VARIABLES.Library.DateTime.ParseAS400Date(
           _query[ARGUMENTS.column][i] 
           ); 
        } 
    
        return _query; 
    </cfscript> 
    

是否有應用一個簡單/快捷方式格式化函數到ColdFusion查詢對象中的整個列?

回答

4

正如@Dan所指出的那樣,a built-in function會將字符串轉換爲時間戳記表示。既然你有一個int,那麼這將是這樣的:

SELECT VARCHAR_FORMAT(TIMESTAMP_FORMAT(CAST(20121119 AS CHAR(8)), 'YYYYMMDD'), 'MM/DD/YYYY') 
FROM SYSIBM.SYSDUMMY1 
+0

這工作很好。但是,如果列中有任何無效值 - 即20100230,該怎麼辦?這是一個有效的整數,但不能轉換爲日期。我得到'[SQL0181]值日期,時間,時間戳字符串無效.'錯誤。 –

+0

唯一的另外一個問題是它創建了一個TIMESTAMP值,然後我仍然需要格式化爲'm/d/yyyy'。 –

+0

還有另一個函數,['VARCHAR_FORMAT()'](http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/index.jsp?topic=%2Fdb2%2Frbafzscavarcharformat.htm),它將從時間戳到您選擇的字符表示(更新示例) – bhamby

2

本頁面可能會幫助您解析db2中您不知道的內容。 Format date to string

編輯:糟糕,你說這是一個整數。 cast()函數會將其轉換爲字符,然後您可以使用concat()substr()對其進行格式化。

使用該功能將是我的方法。

+0

..並考慮將邏輯放入一個'view'中,以便從您的cfquery中重用。 – Leigh

+0

@Leigh - 假設我無法控制數據庫 - 即創建視圖等對象。如果有的話,我可能會爲此創建一個數據庫UDF。 –

+0

@Dan我嘗試使用LEFT()RIGHT()和SUBSTR()解析SQL中的值。我也會嘗試演員。 –

1

做轉換的顯示,使用現有的全球UDF。

這是處理這個問題的正確方法。通常,格式不應該應用於數據模型(這基本上就是您的查詢結果)。顯示數據時應該應用格式。這允許您在不同的上下文中顯示時對數據進行不同的格式設置。此外,它提高了代碼的可讀性。

這裏的缺點是,如果查詢被重新使用,我需要複製轉換顯示值所需的代碼。

這不是缺點。每當您顯示數據時,您都將格式化數據以用於演示。格式化日期也不例外。

調用不止一次格式化數據的函數不是「代碼重複」。您只是簡單地使用格式化函數,因爲它是打算使用的。

+0

這就是我一直在做的方式。我最近開始「簡化」事情,以便每個可在Web瀏覽器中查看的報告都可以下載(現在只需以CSV格式)。所以,我有一個非常漂亮,非常整潔,非常簡單的全局方法,它將查詢轉換爲帶有列標題和所有內容的CSV。如果我重新格式化日期值(幾乎每個報表都有),那麼我必須爲每個報表創建一個單獨的方法。此外,數據實際上是一個日期,它不應該出現在查詢中,而是它的實際值,而不是實際值? –

+0

您的解決方案確實有效 - 問題在於您正在以困難的方式進行。在通過cfoutput顯示值時,更改值的格式會更容易(也更快)。不要爲每個報告編寫單獨的方法,而是編寫一個通用的「報告創建者」函數來處理格式。 – Russ

相關問題