Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PL/SQL在SQL硬代码中对日期的不同处理_Oracle_Date_Plsql - Fatal编程技术网

Oracle PL/SQL在SQL硬代码中对日期的不同处理

Oracle PL/SQL在SQL硬代码中对日期的不同处理,oracle,date,plsql,Oracle,Date,Plsql,我开发了一个简单的查询来放置在pl/sql过程中。通过蟾蜍,我可以传入我的两个变量,它可以完美地执行,但由于某种原因,当我把它放入程序中时,它失败了。我尝试过许多技术,但唯一的解决办法是硬编码日期,这违背了整个目的 投入 DECLARE D_PROJECT_ID NUMBER := 32311; END_DATE DATE := '31-JAN-2015'; ETC_BDLB NUMBER := 0; ETC_BDEC NUMBER := 0; ETC_BDLC

我开发了一个简单的查询来放置在pl/sql过程中。通过蟾蜍,我可以传入我的两个变量,它可以完美地执行,但由于某种原因,当我把它放入程序中时,它失败了。我尝试过许多技术,但唯一的解决办法是硬编码日期,这违背了整个目的

投入

DECLARE
   D_PROJECT_ID  NUMBER := 32311;
   END_DATE  DATE := '31-JAN-2015';
   ETC_BDLB NUMBER := 0;
   ETC_BDEC NUMBER := 0;
   ETC_BDLC NUMBER := 0;
有问题的孩子,第一个选择是唯一可行的

and to_date(b2.attribute2,'DD-MON-YYYY') <= '31-JAN-2015'); RETURNS $$$
                                          and to_date(b2.attribute2,'DD-MON-YYYY') <= END_DATE); --RETURNS 0  END_DATE VARCHAR2(11)
                                          and to_date(b2.attribute2,'DD-MON-YYYY') <= END_DATE); --RETURNS 0 END DATE AS DATE
                                          and to_date(b2.attribute2,'DD-MON-YYYY') <= TRUNC(END_DATE)); --RETURNS 0
                                          and to_date(b2.attribute2,'DD-MON-YYYY') <= TO_DATE(END_DATE, 'DD-MON-YY'));  --RETURNS 0
and to_date(b2.attribute2,'DD-MON-YYYY') <= TO_DATE(END_DATE, 'DD-MON-YYYY'));  --RETURNS 0
我将尝试任何选项。

请尝试:

DECLARE
  END_DATE  DATE;
...
BEGIN
  END_DATE  := TO_DATE ('31-JAN-2015');
...
END ;
请尝试:

DECLARE
  END_DATE  DATE;
...
BEGIN
  END_DATE  := TO_DATE ('31-JAN-2015');
...
END ;
对于日期文字,只能使用此格式

DATE '2015-01-31'
时间分数是不可能的。

对于日期文字,只能使用此格式

DATE '2015-01-31'

时间分数是不可能的。

在处理日期时,请始终记住以下两条基本规则-

永远不要将字符串赋给日期变量并期望它工作 切勿将字符串变量与日期变量进行比较。 有时您可能能够使它工作,但这种实践不应该进入生产代码中。从长远来看,这对DBA来说是一种痛苦

在上面的代码中,这两条规则都被破坏了

END_DATE  DATE := '31-JAN-2015';
左侧是日期类型的变量,右侧是字符串是DD-MON-YYYY没有将其设置为日期,它仍然是字符串。这应该是

END_DATE  DATE := TO_DATE('31-JAN-2015', 'DD-MON-YYYY');
而且

to_date(b2.attribute2,'DD-MON-YYYY') <= '31-JAN-2015'
这是左侧日期和右侧字符串之间的比较。应该是

to_date(b2.attribute2,'DD-MON-YYYY') <= to_date('31-JAN-2015','DD-MON-YYYY);
在将参数传递到过程中时,可能会以约定的格式传递VARCHAR2,但在将其分配给日期变量之前,请使用to_DATE函数将其转换为日期

Oracle根据实施情况在内部将日期存储为7字节或8字节。因此,将标有“2015年1月31日”的字符串与可能包含这8个字节的日期类型进行比较是没有意义的-[223,7,1,31,0,0,0,0]。您首先需要将该字符串转换为具有相同格式(8字节或7字节)的日期类型,然后比较它们


这里还有另一个参数,即NLS_DATE_格式。存在这种情况的唯一原因是,无论何时比较字符串和日期;或者尝试将字符串分配到日期,在返回数据类型不匹配错误之前,oracle将帮您一个忙,并检查该字符串是否遵循此参数中指定的格式。如果是这样,那么甲骨文将在幕后进行最新的调查

处理日期时,请始终记住以下两条基本规则-

永远不要将字符串赋给日期变量并期望它工作 切勿将字符串变量与日期变量进行比较。 有时您可能能够使它工作,但这种实践不应该进入生产代码中。从长远来看,这对DBA来说是一种痛苦

在上面的代码中,这两条规则都被破坏了

END_DATE  DATE := '31-JAN-2015';
左侧是日期类型的变量,右侧是字符串是DD-MON-YYYY没有将其设置为日期,它仍然是字符串。这应该是

END_DATE  DATE := TO_DATE('31-JAN-2015', 'DD-MON-YYYY');
而且

to_date(b2.attribute2,'DD-MON-YYYY') <= '31-JAN-2015'
这是左侧日期和右侧字符串之间的比较。应该是

to_date(b2.attribute2,'DD-MON-YYYY') <= to_date('31-JAN-2015','DD-MON-YYYY);
在将参数传递到过程中时,可能会以约定的格式传递VARCHAR2,但在将其分配给日期变量之前,请使用to_DATE函数将其转换为日期

Oracle根据实施情况在内部将日期存储为7字节或8字节。因此,将标有“2015年1月31日”的字符串与可能包含这8个字节的日期类型进行比较是没有意义的-[223,7,1,31,0,0,0,0]。您首先需要将该字符串转换为具有相同格式(8字节或7字节)的日期类型,然后比较它们


这里还有另一个参数,即NLS_DATE_格式。存在这种情况的唯一原因是,无论何时比较字符串和日期;或者尝试将字符串分配到日期,在返回数据类型不匹配错误之前,oracle将帮您一个忙,并检查该字符串是否遵循此参数中指定的格式。如果是这样,那么甲骨文将在幕后进行最新的调查

虽然我不推荐我的解决方案,但我将输入参数改为varchar2,而不是日期。数据库中的日期也存储为varchar2,在比较之前,这两个变量都要经过to_date函数。

虽然我不推荐我的解决方案,但我将输入参数改为varchar2而不是日期。数据库中的日期也存储为varchar2,在比较之前,这两个变量都要通过to_date函数。

Allready尝试分配一个在declare部分显式转换的日期:END_date:=to_date'31-01-2015',DD-MM-YYYY;,为了确保END_date包含所需的日期,我假设第二个参数应该有单引号。它给了我同样的结果。根据变量打印语句,我可以判断日期是否正确。您的attribute2值是多少?您的NLS_DATE_格式是什么?attribute2存储我正在比较的日期,它是表中的一个varchar字段。桌子
是种子oracle表。Allready尝试将在声明部分中显式转换的日期指定为:END_date:=to_date'31-01-2015',DD-MM-YYYY;,为了确保END_date包含所需的日期,我假设第二个参数应该有单引号。它给了我同样的结果。根据变量打印语句,我可以判断日期是否正确。您的attribute2值是多少?您的NLS_DATE_格式是什么?attribute2存储我正在比较的日期,它是表中的一个varchar字段。该表是一个种子oracle表。能否提供一些示例?从b2中选择to_dateb2.attribute2;attribute2包含如下数据:2013年6月30日2013年7月31日2013年8月30日2013年9月31日2013年10月30日2013年11月31日2013年12月31日2014年1月28日2014年2月31日2014年3月31日您是否知道,日期不仅包含日、月、年值,还包含小时、分钟和秒?如果您创建一个新日期,仅提供其中一些值,“2015年1月31日”,您能提供一些示例吗?从b2中选择to_dateb2.attribute2;attribute2包含如下数据:2013年6月30日2013年7月31日2013年8月30日2013年9月31日2013年10月30日2013年11月31日2013年12月31日2014年1月28日2014年2月31日2014年3月31日您是否知道,日期不仅包含日、月、年值,还包含小时、分钟和秒?如果您创建一个新日期,仅提供其中一些值,“2015年1月31日”