当前位置: 首页 > 知识库问答 >
问题:

Oracle-SQL查询在SQL Developer中运行良好,但引发错误ORA-01861 Literal与SSIS中的格式字符串不匹配

嵇出野
2023-03-14

我正在尝试将DD-MON-RR转换为oracle中的YYY-MM-DD格式,我写了下面的转换,它在SQLDeveloper中运行良好。

TO\u CHAR(TO\u DATE(DATE,'DD-MON-RR'),'YYYY-MM-DD')

但是,如果我在SSIS中使用相同的查询,它会抛出与格式字符串不匹配的ORA-01861文本。

非常感谢您的帮助!!

共有1个答案

公良昕
2023-03-14

TO\u CHAR(日期,'YYYY-MM-DD')输出:0258-07-20

这意味着数据库中存储的日期实际上是258年,而不是1958年。

当你这么做的时候

TO_CHAR(TO_DATE(date,'DD-MON-RR'),'YYYY-MM-DD')

您正在使用当前会话NLS日期格式将日期隐式转换为字符串,该格式将为您提供一个类似“20-JUL-58”的字符串。然后使用格式掩码“DD-MON-RR”将其显式转换回日期。

您正在有效地执行以下操作:

TO_CHAR(TO_DATE(TO_CHAR(date,<nls_date_format>),'DD-MON-RR'),'YYYY-MM-DD')

在SQL开发人员会话中,有效地:

TO_CHAR(TO_DATE(TO_CHAR(date,'DD-MON-RR'),'DD-MON-RR'),'YYYY-MM-DD')

因为中间字符串有一个2位数的年份(58),并且有RR元素,所以变成1958年。

当您从SSIS做同样的事情时,会话日期格式似乎有一个4位数的年份,因此它有效地执行了以下操作:

TO_CHAR(TO_DATE(TO_CHAR(date,'DD-MM-YYYY'),'DD-MON-RR'),'YYYY-MM-DD')

现在,中间字符串有一个4位数的年份(0258),RR元素保持为0258。

现在您可以指定中间字符串格式,而不是依赖NLS,这至少在两个会话之间是一致的:

TO_CHAR(TO_DATE(TO_CHAR(date,'DD-MON-RR'),'DD-MON-RR'),'YYYY-MM-DD')

或者将SSIS视为日期而不是字符串,删除外部to_char()

TO_DATE(TO_CHAR(date,'DD-MON-RR'),'DD-MON-RR')

还要注意,此转换以午夜值的时间部分结束;如果你的源日期有非午夜时间(根据评论可能不是因为它是出生日期),并且你想保留这些时间,那么你应该在面具中包括时间:

TO_DATE(TO_CHAR(date,'DD-MON-RR HH24:MI:SS'),'DD-MON-RR HH24:MI:SS')

但是这种双重转换对于坏数据来说是一种棘手的解决方法,实际上,您应该修复源表中的数据以获得正确的年份,并查看如何插入值以防止它们再次出错。

根据它们错误的确切方式和原因——可能是不正确或隐式的格式掩码和/或插入过程中意外的NLS设置——您可能需要评估是否可以依赖年份的最后两位数字是正确的并匹配RR元素行为。也许您是否可以依赖月份和日期部分是正确的。

 类似资料:
  • 问题内容: 我收到以下错误: 第一个字段是格式。 有任何想法吗? 谢谢。 问题答案: 当您将字符串值插入日期列时,则需要在使用函数期间将其转换为日期。使用此功能时,您将提供字符串的格式。 功能格式: 因此,您的查询将如下所示: 参见带有演示的SQL Fiddle

  • 用编译后,我尝试用java运行,它运行了,但随后抛出了一个

  • 问题内容: 我正在尝试找到格式化sql查询字符串的最佳方法。在调试应用程序时,我想记录所有sql查询字符串的文件,并且正确格式化字符串很重要。 选项1 这对于打印sql字符串很有用。 如果字符串太长且不适合80个字符的标准宽度,则不是一个好的解决方案。 选项2 这里的代码很清楚,但是当您打印sql查询字符串时,会得到所有这些烦人的空格。 的u ‘\ n选取FIELD1,FIELD2,字段3,字段4

  • 问题内容: 我使用jQuery Ajax,如下所示: 即使我没有在Chrome中设置dataType,它也能很好地工作,但是,它在FF中失败,并带有XML解析错误。 响应Headersview源 服务器Apache-Coyote / 1.1 传输编码大块 数据日期,星期二,2011年10月4日00:08:08 GMT 请求Headersview源 主机localhost:8080 用户代理Mozi

  • 当我执行时 在控制台(javascript)中,它通过类名返回元素,但是当我执行时: < code > driver . find elements(by . class name(" jobs-company-card _ _ content-wrapper ")); 结果(元素)是一个空的列表,注意返回