添加where子句时,Literal与格式字符串不匹配

时间:2015-10-06 17:01:48

标签: sql oracle oracle11g

CREATE OR REPLACE FORCE VIEW "node4"."Test_View" ("APP_ID", "DayDifference") AS  
SELECT BM.APP_ID, BM.DayDifference 
FROM (      SELECT  APPS.APP_ID,
                    to_date(to_char(APPS.date_to_subtract, 'yyyy-mm-dd')) 
                    - to_date(to_char(sysdate, 'yyyy-mm-dd')) AS DayDifference      
            FROM node4.applications APPS        
) BM
WHERE BM.DayDifference = 16;

我正在减去两个日期并根据它缩小我的观点,我希望天数不同,所以我使用to_char。但是,在最后添加WHERE子句会抛出一个"文字与格式字符串不匹配"我尝试在程序中提取数据时出错。最初我在视图中没有内部选择,但我认为这样做可以解决我的问题。如果我删除WHERE子句,一切都很好。我也尝试在WHERE子句中进行减法,但得到了同样的错误。 (date_to_subtract是一个时间戳。)如果有人可以给我任何见解,因为我很难过。谢谢。

2 个答案:

答案 0 :(得分:3)

这很可能与WHERE子句无关。请注意你是如何得到日期的:

to_date(to_char(APPS.date_to_subtract, 'yyyy-mm-dd'))

首先将日期转换为字符串,然后尝试解析字符串。但是,您没有为解析方法提供格式。所以我认为它依赖于会话设置,关于默认格式是什么,可以从客户端更改为客户端。每当使用to_date时,您应始终提供格式:

to_date(to_char(APPS.date_to_subtract, 'yyyy-mm-dd'), 'yyyy-mm-dd')

但在这种情况下,您只是试图截断日期的时间。为此目的使用TRUNC要简单得多:

trunc(APPS.date_to_subtract)
默认情况下,

trunc会将时间部分设置为午夜。在考虑时区时,您可能需要确保其按预期工作。

答案 1 :(得分:-1)

替换此表达式:

to_date(to_char(APPS.date_to_subtract, 'yyyy-mm-dd')) 
- to_date(to_char(sysdate, 'yyyy-mm-dd')) AS DayDifference

使用:

trunc( APPS.date_to_subtract ) - trunc( sysdate ) AS DayDifference