to_date与AS400

时间:2014-07-16 09:43:56

标签: sql db2 ibm-midrange to-date db2-400

我写信给你是因为我无法在AS400数据库上使用运算符to_date

使用Oracle数据库,我使用:

datefield >= to_date('01/01/2014','DD/MM/YYYY')

但是使用AS400,我收到一个错误:

  

不兼容的运算符

是否还有其他功能可用于替换to_date

2 个答案:

答案 0 :(得分:5)

假设datefield是实际日期数据类型

然后您需要做的就是使用ISO格式的日期字符串

datefield >= '2014-01-01'

DB2 for IBM i将始终将'2014-01-01'视为日期。

但是如果你真的想自己明确转换它,那么就有两个函数

DATE('2014-01-01')
CAST('2014-01-01' as DATE)

CAST是便携性的首选。

我建议坚持使用ISO格式,但系统会识别美国'mm / dd / yyyy'和''dd.mm.yyyy'。

参考此处:

http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_71/db2/rbafzdtstrng.htm

答案 1 :(得分:0)

我意识到这个主题是,但目前的答案似乎主要是忽略TO_DATE的原始问题,而是提供规避;当然,规避是IMO,一种更好的方法。通过添加消息标识符以及对原始问题和可能的解决方案的进一步解释,希望这些对于其他人有益于将讨论定位为与他们自己的问题相匹配并且有益于所提供的额外评论。

OP中描述的问题反映了错误条件SQL0401 [sqlcode -401]诊断TO_DATE标量的数据类型是TIMESTAMP,而DateField列数据类型是DATE [或者暗示,虽然OP已经包含了用于TABLE的DDL,但审核人可以确信“datefield”确实是DATE数据类型的一列]。

在v5r3中,“原因”由文本“日期,时间和时间戳操作数与字符操作数或与同一类型的另一个操作数兼容”描述。 FWiW USEnglish [第一级]文本可能是“比较运算符> =操作数不兼容。”,而不仅仅是OP中提到的“不兼容运算符”。即使是v7r1,文档也建议不要对SQL0401进行更改:
http://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/rzala/rzalaml.htm

  

” ...   
日期,时间和时间戳操作数与字符和图形操作数或同一类型的另一个操作数兼容。   
......“

尽管有标量函数的名称,但对于给出该名字对象的逻辑效果,标量结果是 DATE数据类型;相反,效果反映了标量函数名称TIMESTAMP_FORMAT,从而产生了TIMESTAMP标量结果。名字TO_DATE只是一个同义词\ syntax-alternative:
http://www.ibm.com/support/knowledgecenter/api/content/ssw_ibm_i_71/db2/rbafzscatsformat.htm

最初描述的场景datefield >= to_date('01/01/2014','DD/MM/YYYY'),其中编码了非标准日期格式,可以通过将该TO_DATE标量的结果显式地转换为DATE类型来防止错误。例如,通过将TO_DATE结果包装在另一个[cast]标量中,例如,DATE投射标量中的任一个datefield >= DATE(to_date('01/01/2014','DD/MM/YYYY'))
或者CAST标量
{{1} }

当然使用格式化为标准日期格式之一的字符串的其他替代方法[例如*查尔斯建议的ISO可能就是这么简单;即使该用法没有明确地显示[对于语句的审阅者],也就是指定为TO_DATE()上的第二个参数的 format-string 。但根据最初显示为“DD / MM / YYYY”的规格,首选项可能是使用格式为'DD.MM.YYYY'的* EUR标准格式;即编码为datefield >= CAST(to_date('01/01/2014','DD/MM/YYYY') as DATE)

请注意,除了日期字符串文档参考http://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/db2/rbafzdatestrings.htm之外,还有另一个在该页面上未提及的替代方案,它是* ISO格式字符串的一种冗余形式, datefield >= '01.01.2014'几乎相同[规范和冗余;替代方案只是保存键入括号]作为本主题其他地方已经提到的DATE [cast]标量规范DATE '2014-01-01'。因此DATE('2014-01-01')datefield >= DATE'2014-01-01'datefield >= '2014-01-01'中的每一个都是等价的,并且每个都取决于字符串的* ISO格式作为日期表示。