【问题标题】:Cast Varchar2 to date in Oracle PL/SQL在 Oracle PL/SQL 中将 Varchar2 转换为最新
【发布时间】:2015-12-13 06:29:33
【问题描述】:

我在 Oracle PL/SQL 中有一个查询,它根据客户延迟支付的账单百分比给出了一个按客户名称排序的列表。查询如下

With date_check AS
    (Select *
        From tblBills
        Where Pay_Date Between CAST('2015-09-01' AS DATE) And CAST('2015-09-30' AS DATE)
    )
    Select ddo.CODE As "Customer Name",
      100.0 * ROUND(Cast(Count(fpp.ID) AS FLOAT)  / 
      ( Select Count(fpp2.ID)
        From date_check fpp2 
        Join tblMethods dppm2
         On fpp2.PAY_METHOD = dppm2.ID
        Where dppm2.IS_DELAYED = 'Y'), 2) As "% Delay"
    From date_check fpp
      Join tblMethods dppm On fpp.PAYMENT_METHOD_ID = dppm.ID
      Join tblCustomers ddo On fpp.CUSTOMER_ID = ddo.ID
    Where dppm.IS_DELAYED = 'Y'
    Group By ddo.CODE
    Order By Count(fpp.ID) Desc

当我运行此查询时,我收到以下异常:

ORA-01861:文字与格式字符串不匹配
01861. 00000 - “文字与格式字符串不匹配”
*原因:输入中的文字必须与输入中的文字长度相同 格式字符串(前导空格除外)。如果 “FX”修饰符已打开,文字必须完全匹配, 没有多余的空格。
*操作:更正格式字符串以匹配文字。

怎么了?

【问题讨论】:

    标签: sql string oracle date literals


    【解决方案1】:

    要么使用日期文字

    Where Pay_Date Between date '2015-09-01' And date '2015-09-30'
    

    或使用带有显式格式掩码的to_date 函数将字符串转换为日期

    Where Pay_Date Between to_date('2015-09-01', 'YYYY-MM-DD') And 
                           to_date('2015-09-30', 'YYYY-MM-DD')
    

    直接的cast 将使用当前会话的nls_date_format 设置的任何值。随着时间的推移,每个人的情况不太可能相同,因此您不希望构建依赖于它的代码。

    【讨论】:

      猜你喜欢
      • 2012-10-03
      • 2021-06-16
      • 2014-08-24
      • 2013-04-27
      • 2011-11-28
      • 2019-09-11
      • 2015-09-16
      • 1970-01-01
      • 2021-03-18
      相关资源
      最近更新 更多