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是一个时间戳。)如果有人可以给我任何见解,因为我很难过。谢谢。
答案 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