2014-07-22 33 views
1

我們正在面對我們的查詢中的一個奇怪問題。 下面是我們運行數據值「0」在紅移中的格式錯誤無效

INSERT into test 
SELECT 
    member.name as mem_name, 
    CASE WHEN (member.dob>0 AND length (member.dob)=8) THEN (DATEDIFF(year,to_date("dob",'YYYYMMDD'), to_date(20140716,'YYYYMMDD'))) WHEN (member.dob=0) Then 0 END As Age, 
    20140716021501 
FROM 
    member 

下面的查詢是出現在我們的餐桌樣本數據。

|name   |dob 
|Ajitsh   |0  | 
|rk    |51015 | 
|s_thiagarajan |19500130 | 
|madhav_7  |19700725 | 
|1922   |0  | 
|rekha   |25478 | 
|vmkurup  |0  | 
|ravikris  |19620109 | 
|ksairaman  |0  | 
|sruthi   |0  | 
|rrbha   |19630825 | 
|sunilsw  |0  | 
|sunilh   |0  | 
|venky_pmv  |19701207 | 
|malagi   |0  | 
|an752001  |0  | 
|edsdf   |19790201 | 
|anuanand  |19730724 | 
|fresh   |19720821 | 
|ampharcopharma |19590127 | 
|Nanze   |19621123 | 

出生日期存儲在bigint中,格式爲YYYYMMDD。 在數據中有一些行,其中日期無效,如0,51015。 在某些情況下,此查詢會引發以下錯誤。

INSERT INTO test not successful 
An error occurred when executing the SQL command: 
INSERT into test 
SELECT 
    member.name as mem_name, 
    CASE WHEN (member.dob>0 AND length (member.dob)=8) THEN (DATEDIFF(y... 

ERROR: Data value "0" has invalid format 
    Detail: 
    ----------------------------------------------- 
    error: Data value "0" has invalid format 
    code:  1009 
    context: PG ERROR 
    query:  92776 
    location: pg_utils.cpp:2731 
    process: query1_30 [pid=1434] 
    ----------------------------------------------- 


Execution time: 3.99s 

1 statement failed. 

但奇怪的是,它隨機而不是所有的時間都會引發錯誤。 很多時候它在查詢或數據集中沒有任何改變。 有時它也可以在第二次或第三次嘗試。 我的疑問是,to_date函數給出了這個錯誤。但爲什麼隨機 ,並沒有給每個運行的錯誤。

爲了支持我的假設,我也嘗試了這個小查詢。
SELECT to_date(20140716,'YYYYMMDD'), to_date(0,'YYYYMMDD');
但是這也產生了相同的情況。它隨機引發錯誤,而 順利運行其餘時間。

+0

你曾經得到過這個問題的答案嗎?我有一個相關的問題。我正在執行'WHERE(getdate():: date - date_value :: date)<= 90'操作,並且返回的錯誤是「數據值....具有無效格式」。 奇怪的是,'getdate():: date - date_value :: date'按預期工作,但在WHERE中使用時,會拋出錯誤。 –

+0

@Moon_Watcher,我沒有得到滿意的答案。一種解決方法,我認爲你可以使用'WITH'子句。例如'與溫度AS(選擇getdate()::日期 - 日期值::日期爲差異從表名)選擇列從臨時WHERE diff <= 90'。 – jimy

回答

0

如果忽略這種類型的值並將其轉換爲日期格式可以遵循以下方式。

SELECT to_date('20140716','YYYYMMDD'), to_date('0','FMYYYYMMDD'); 

這裏FM抑制前導零和尾隨空白,否則將被添加以使模式的輸出爲固定寬度。

+0

@llesh感謝您使用'FM'選項。但我主要關心的是爲什麼錯誤會隨機引發,而不是每次查詢都被觸發。 – jimy

相關問題