2011-12-22 55 views
1

可能重複:
Convert DB2 SQL Decimal to DATEwhere子句中轉換小數最新

我有一個DB2數據庫,我想在where子句中的選擇十進制轉換爲日期聲明。

十進制日期可能根據月份可能爲12或13個字符。

12個字符:

,241,999.00應該成爲:1999//24

13性狀:

,241,999.00應成爲:1999//24

列名是DECIMALCOLUMN:

Select * from table1 WHERE 
cast(replace(convert,DECIMALCOLUMN,date)) = @date 
+0

問題是什麼? – wallyk 2011-12-22 16:05:56

+0

問題是,如何將十進制日期(12-13個字符長)轉換爲日期格式。在這個例子中,年份也會移到日期的前面。 – tdjfdjdj 2011-12-22 16:07:26

+0

請注意,嘗試將數字字段直接轉換爲日期字段將導致意料之外的值 - DB2將數字輸入視爲自_ 0001的數字(-1)0001-01-01 – 2011-12-22 16:39:43

回答

1

我看到:你想重新安排一個號碼的數字成爲的一些方法日期。它看起來像編碼是[m]mddyyyy。 (爲什麼數據庫中不是date數據類型?)

該數字需要轉換爲字符串,然後將子字符串排列並轉換爲日期。考慮到這裏的複雜性,應該寫一個轉換函數來代替被更改爲適當數據類型的字段。像這樣的東西應該這樣做(未經測試,沒有訪問DB2):

create function decimaldate(decdate DECIMAL) 
returns DATE 
return 
with tmp (dstr) as 
(
    select substr(digits (decdate),8) 
    from sysibm.sysdummy1 
) 
select 
    date (substr(dstr,4,4) || '-' || 
     substr(dstr,1,2) || '-' || 
     substr(dstr,3,2) 
     ) 
from tmp 

這個數轉換爲字符串,格式化字符串作爲yyyy-mm-dd並將其轉換成日期。 (我用this爲基礎。)

因此,解決原來的問題是簡單地寫:

SELECT * 
FROM table1 
WHERE decimaldate(DECIMALCOLUMN) = @date 

與編碼在數據庫中的日期的這種扭曲的方式,有隨時可用的功能應該證明是非常寶貴的。

+0

這是完美的。你是對的。謝謝。唯一的問題是我只有選擇訪問權限。我不能在數據庫中創建一個函數。還有一些選擇你的代碼嗎? – tdjfdjdj 2011-12-22 18:08:13

+0

@ user719825:試試這個:WHERE date(substr(digits(DECIMALCOLUMN),4,4)||' - '|| substr(digits(DECIMALCOLUMN),1,2)||' - '|| substr(digits (DECIMALCOLUMN),3,2))= @ date'。Yucky,但功能上相同。如果有任何問題,請嘗試顯示錶達式和'decimalcolumn'來查看可能出錯的內容。 – wallyk 2011-12-22 19:50:21