我写信给你是因为我不能to_date
在 AS400 数据库上使用运算符。
对于 Oracle 数据库,我使用:
datefield >= to_date('01/01/2014','DD/MM/YYYY')
但是使用 AS400,我得到一个错误:
不兼容的运算符
我可以使用其他功能来替换to_date
吗?
我写信给你是因为我不能to_date
在 AS400 数据库上使用运算符。
对于 Oracle 数据库,我使用:
datefield >= to_date('01/01/2014','DD/MM/YYYY')
但是使用 AS400,我得到一个错误:
不兼容的运算符
我可以使用其他功能来替换to_date
吗?
假设 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 格式,尽管系统会识别 USA 'mm/dd/yyyy' 和 EUR 'dd.mm.yyyy'。
参考这里:
http://www-01.ibm.com/support/knowledgecenter/ssw_ibm_i_71/db2/rbafzdtstrng.htm
我意识到这个话题很老,但目前的答案似乎主要是忽略了 TO_DATE 的原始问题,而是提供了一种规避;当然,规避是IMO,一种更好的方法。通过添加消息标识符和对原始问题和可能的解决方案的进一步解释,希望这些对其他人有益,既可以将此讨论定位为与他们自己的问题相匹配,也有利于提供的附加评论。
OP 中描述的问题反映了错误条件 SQL0401 [sqlcode -401] 诊断 TO_DATE 标量的数据类型是 TIMESTAMP 而 DateField 列数据类型是 DATE [或暗示,尽管如果OP 已包含 TABLE 的 DDL,审阅者可以确信“日期字段”确实是 DATE 数据类型的列]。
在 v5r3 中,“原因”由文本“日期、时间和时间戳操作数与字符操作数或与另一个相同类型的操作数兼容”来描述。FWiW 美国英语 [第一级] 文本可能是“比较运算符 >= 操作数不兼容。”,而不仅仅是 OP 中指出的“不兼容运算符”。即使到了 v7r1,文档也建议 SQL0401 没有更改:http:
//www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/rzala/rzalaml.htm
“...
日期、时间和时间戳操作数与字符和图形操作数或相同类型的另一个操作数兼容
。...”
尽管有标量函数的名称,但对于给定该名称的逻辑效果,标量结果不是DATE 数据类型;该效果反而反映了标量函数名称 TIMESTAMP_FORMAT,从而产生了 TIMESTAMP 标量结果。绰号 TO_DATE 只是一个同义词\语法替代:
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 结果包装在另一个 [casting] 标量中,例如 DATE 转换标量
datefield >= DATE(to_date('01/01/2014','DD/MM/YYYY'))
或 CAST 标量datefield >= CAST(to_date('01/01/2014','DD/MM/YYYY') as DATE)
当然,使用格式化为标准日期格式之一的字符串的其他替代方法[例如 Charles 建议的 *ISO] 可能同样简单;即使这种用法没有像TO_DATE() 上的第二个参数指定的格式字符串那样明确地揭示[对语句的审阅者]。但根据最初显示为“DD/MM/YYYY”的规范,可能首选使用格式为“DD.MM.YYYY”的*EUR标准格式;即编码为datefield >= '01.01.2014'
请注意,除了日期字符串文档参考http://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/db2/rbafzdatestrings.htm之外,该页面上还有另一种选择,它是 * ISO格式的字符串,DATE '2014-01-01'
和[规范和冗余都差不多;替代方法只是将括号] 保存DATE('2014-01-01')
为本主题其他地方已经提到的 DATE [casting] 标量规范。因此,每个datefield >= DATE'2014-01-01'
or datefield >= '2014-01-01'
ordatefield >= DATE('2014-01-01')
都是等效的,并且每个都取决于字符串的 *ISO 格式作为日期表示。