Sql Oracle日期格式的问题
查询1:冗余的最新用法:Sql Oracle日期格式的问题,sql,oracle,to-date,Sql,Oracle,To Date,查询1:冗余的最新用法: SELECT 1 FROM dual WHERE '22-APR-2018'>add_months(to_date( (to_date('28-02-2018' ,'dd-mm-yyyy') ) ,'dd-mm-yyyy'),60); SELECT 1 FROM dual where '22-APR-2018'>ADD_MONTHS(TO_DATE('28-02-2018' ,'dd-mm-yyyy'),60); -- 查询2:单个截止日期用法: S
SELECT 1
FROM dual
WHERE '22-APR-2018'>add_months(to_date(
(to_date('28-02-2018' ,'dd-mm-yyyy') ) ,'dd-mm-yyyy'),60);
SELECT 1
FROM dual where '22-APR-2018'>ADD_MONTHS(TO_DATE('28-02-2018' ,'dd-mm-yyyy'),60);
--
查询2:单个截止日期用法:
SELECT 1
FROM dual
WHERE '22-APR-2018'>add_months(to_date(
(to_date('28-02-2018' ,'dd-mm-yyyy') ) ,'dd-mm-yyyy'),60);
SELECT 1
FROM dual where '22-APR-2018'>ADD_MONTHS(TO_DATE('28-02-2018' ,'dd-mm-yyyy'),60);
在任何情况下,这些查询都不能返回数据,因为2018年4月22日永远不会大于2023年2月28日
但是查询1返回数据。我不理解oracle在这里的功能。'2018年4月22日'不是日期,而是字符串。因此,条件的两边都隐式地转换为字符串和'APR'<'FEB' 使用
在其上添加日期
,或者(更容易)使用ANSI文字,以便比较日期
值:
SELECT 1
FROM dual where DATE '2018-04-22'>ADD_MONTHS(TO_DATE('28-02-2018' ,'dd-mm-yyyy'),60);
“2018年4月22日”不是日期,而是字符串。因此,条件的两边都隐式地转换为字符串和'APR'<'FEB' 使用
在其上添加日期
,或者(更容易)使用ANSI文字,以便比较日期
值:
SELECT 1
FROM dual where DATE '2018-04-22'>ADD_MONTHS(TO_DATE('28-02-2018' ,'dd-mm-yyyy'),60);
这段代码有一些问题。其中之一是:
to_date((to_date('28-02-2018', 'dd-mm-yyyy')), 'dd-mm-yyyy')
或不带双支架:
to_date(to_date('28-02-2018', 'dd-mm-yyyy'), 'dd-mm-yyyy')
to_date()
采用字符串参数,因此Oracle必须将它从获得的日期转换为日期('28-02-2018','dd-mm-yyyy')
。因此,这意味着
to_date(to_char(to_date('28-02-2018', 'dd-mm-yyyy')), 'dd-mm-yyyy')
to_char(截止日期('28-02-2018','dd-mm-yyyy')
给了您什么?它将取决于您的nls\u date\u格式
,该格式通常默认为DD-MON-RR
,在这种情况下,您将得到28-FEB-18
,并将其转换回YYYY
年格式的日期,得到0018年2月28日(Oracle隐式解释FEB
,以匹配MM
),2018年4月22日之前
Oracle还隐式地将比较中的字符串转换为日期,再次使用默认的日期格式,因此,尽管将字符串与日期进行比较并希望得到最好的结果显然是一个坏主意,但在这种情况下,您可以侥幸逃脱
在Oracle中,我们将日期文字写为
date '2018-04-22'
而不是
'22-APR-2018'
所以写这篇文章的正确方法是
select 1
from dual
where date '2018-04-22' > add_months(date '2018-02-28', 60);
没有行。此代码存在一些问题。其中之一是:
to_date((to_date('28-02-2018', 'dd-mm-yyyy')), 'dd-mm-yyyy')
或不带双支架:
to_date(to_date('28-02-2018', 'dd-mm-yyyy'), 'dd-mm-yyyy')
to_date()
采用字符串参数,因此Oracle必须将它从获得的日期转换为日期('28-02-2018','dd-mm-yyyy')
。因此,这意味着
to_date(to_char(to_date('28-02-2018', 'dd-mm-yyyy')), 'dd-mm-yyyy')
to_char(截止日期('28-02-2018','dd-mm-yyyy')
给了您什么?它将取决于您的nls\u date\u格式
,该格式通常默认为DD-MON-RR
,在这种情况下,您将得到28-FEB-18
,并将其转换回YYYY
年格式的日期,得到0018年2月28日(Oracle隐式解释FEB
,以匹配MM
),2018年4月22日之前
Oracle还隐式地将比较中的字符串转换为日期,再次使用默认的日期格式,因此,尽管将字符串与日期进行比较并希望得到最好的结果显然是一个坏主意,但在这种情况下,您可以侥幸逃脱
在Oracle中,我们将日期文字写为
date '2018-04-22'
而不是
'22-APR-2018'
所以写这篇文章的正确方法是
select 1
from dual
where date '2018-04-22' > add_months(date '2018-02-28', 60);
它不提供任何行。绝对不需要使用
select
来提供常量值。这本可以避免。我没有注意到,因为我只是试图模拟应用程序脚本中的问题。问题已编辑。为什么要对已经是日期的内容应用_date()?永远不要那样做;当您这样做时,您强制Oracle将日期转换为字符串,以便可以再次将其转换回日期,并且它使用NLS_date_FORMAT参数确定要使用的格式掩码。如果您的日期字符串不是预期的格式,这可能会导致转换中出现问题。完全不需要使用select
来提供常量值。这是可以避免的。我没有注意到,因为我只是试图模拟应用程序脚本中的问题。问题已编辑。为什么要对已经是日期的内容应用_date()?永远不要那样做;当您这样做时,您强制Oracle将日期转换为字符串,以便可以再次将其转换回日期,并且它使用NLS_date_FORMAT参数确定要使用的格式掩码。如果您的日期字符串不是预期格式,这可能会导致转换中出现问题。从dual WHERE to_date('22-04-2018','dd-mm-yyyy')中选择1>添加_月(to_date((从dual中选择to_date('28-02-2018','dd-mm-yyyyy'),60)
这个带有to_date
的查询还表示2018年4月22日大于2023年2月22日,所以现在您引入了一个伪select to_date(…)from dual
返回日期,然后将to_date
应用于迫使Oracle首先隐式将其转换为字符串的查询。。。不要那样做@维韦克:一步一步地看看发生了什么。这里实际上是比较22-04-2018
28-02-0023
,这是由于隐式转换true@KaushikNayak加上2023年的月数(截至2018年2月28日,'dd-mm-yyyy'),60)。你为什么提到0023?@vivek不是这个。在您之前的评论中。从双精度中选择1,其中至日期('2018年4月22日','dd-mm-yyyy')>添加月数(至日期((从双精度中选择至日期('2018年2月28日','dd-mm-yyyy'),'dd-mm-yyyy'),60)
这个带有to_date
的查询还表示2018年4月22日大于2023年2月22日,所以现在您引入了一个伪select to_date(…)from dual
返回日期,然后将to_date
应用于迫使Oracle首先隐式将其转换为字符串的查询。。。不要那样做@维韦克:一步一步地看看发生了什么。这里实际上是比较22-04-2018
28-02-0023
,这是由于隐式转换true@KaushikNayak加上2023年的月数(截至2018年2月28日,'dd-mm-yyyy'),60)。你为什么提到0023?@vivek不是这个。在你之前的评论中。清晰的解释<代码>日期“2018-04-22”似乎是技术上的方式,但oracle似乎很舒服