Sql 日期问题:TO_DATE()

Sql 日期问题:TO_DATE(),sql,oracle,Sql,Oracle,我试图审核一些数据,以查找报告名称字段的会计年度与报告日期字段不匹配的地方 表:交易 字段: 报告名称(始终以当前会计年度的最后两位数字结尾,例如2015会计年度的“transactions15”) 报告日期应为特定会计年度内的日期 我们的财政年度从7月1日到6月30日 到目前为止,我所掌握的情况如下: SELECT report_name, report_date FROM reports WHERE report_date BETWEEN TO_DATE('01-JUL-' || (

我试图审核一些数据,以查找报告名称字段的会计年度与报告日期字段不匹配的地方

表:交易

字段: 报告名称(始终以当前会计年度的最后两位数字结尾,例如2015会计年度的“transactions15”)

报告日期应为特定会计年度内的日期

我们的财政年度从7月1日到6月30日

到目前为止,我所掌握的情况如下:

SELECT report_name, report_date
FROM reports
WHERE report_date 
BETWEEN 
  TO_DATE('01-JUL-' || (SUBSTR(report_name,-2) - 1),'DD-MON-YY')
AND
  TO_DATE('30-JUN-' || (SUBSTR(report_name,-2)),'DD-MON-YY')
不幸的是,我得到了一个错误:

ORA-01841:(完整)年份必须介于-4713和+9999之间,而不是0


我想SUBSTR(报告名称,-2)一定是问题所在?但是,我能够在查询中显示它而不出错,因此我感到困惑。

最好更改您的逻辑:

WHERE report_name NOT LIKE '%' || TO_CHAR(ADD_MONTHS(report_date,-6), 'yy')

问题是你在哪里有-1来减少一年。如果您的报表名称以
00
结尾,例如
transaction00
,则您的合并年份以-1结尾。然后你就可以:

select to_date('01-JUL--1', 'DD-MON-YY') from dual;
其中还包括:

ORA-01841: (full) year must be between -4713 and +9999, and not be 0
您可以通过使用原始的最后两位数字来避免这种情况,并使用另一种机制(如
add\u months()
)追溯到一年前:

现在显示转换工作

我把格式模型从YY改为RR,因为如果你有2000年的记录,你可能有1999年或更早的记录,如果YY值为'99',则会被视为2099,而不是1999年

使用月份名称或缩写取决于NLS语言,因此使用月份编号更安全;或者,您可以覆盖日期语言作为查询的一部分,但这需要更多的键入


还要注意的是之间的
是包含在内的,但仅限于6月30日午夜之前。如果当天晚些时候您还有其他时间,则将错过这些时间。

您的转换。也许你的名字不符合这个模式?report_date实际上是一个日期列,而不是一个字符串吗?具体来说,您有一个以
00
结尾的报告名吗?感谢您的详细解释,并正确预测我有2000年的报告!我有一份工作报告,对如何提取正确的记录有更好的理解。
SELECT report_name, report_date
FROM reports
WHERE report_date 
BETWEEN 
  ADD_MONTHS(TO_DATE('01-JUL-' || (SUBSTR(report_name,-2)),'DD-MON-RR'), -1)
AND
  TO_DATE('30-JUN-' || (SUBSTR(report_name,-2)),'DD-MON-RR')