数据值“0”在红移中有无效格式错误
Posted
技术标签:
【中文标题】数据值“0”在红移中有无效格式错误【英文标题】:Data value "0" has invalid format error in redshift 【发布时间】:2014-07-22 11:56:06 【问题描述】:我们的一个查询遇到了一个奇怪的问题。 下面是我们正在运行的查询
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 |
出生日期以 YYYYMMDD
格式存储在 bigint 中。
在数据中有一些行,其中日期无效,如 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');
但这也造成了同样的情况。它随机引发错误,而
其余时间运行平稳。
【问题讨论】:
你有没有得到这个问题的答案?我有一个相关的问题。我正在执行WHERE (getdate()::date - date_value::date) <=90
操作,返回的错误是“数据值....具有无效格式”。奇怪的是getdate()::date - date_value::date
按预期工作,但是在WHERE中使用时,它会抛出错误。
@Moon_Watcher,这个问题我没有得到满意的答案。我认为您可以使用WITH
子句来解决此问题。例如WITH temp AS ( SELECT getdate()::date - date_value::date as diff FROM tablename) SELECT columns FROM temp WHERE diff <=90
.
【参考方案1】:
如果可以忽略这种类型的值并将其转换为日期格式,您可以按照以下方式进行操作。
SELECT to_date('20140716','YYYYMMDD'), to_date('0','FMYYYYMMDD');
这里 FM 抑制了前导零和尾随空白,否则它们会被添加以使模式的输出为固定宽度。
【讨论】:
@llesh 感谢FM
选项。但我主要关心的是为什么错误是随机引发的,而不是每次触发查询时。以上是关于数据值“0”在红移中有无效格式错误的主要内容,如果未能解决你的问题,请参考以下文章