如果日期相同,则查询 BETWEEN 不起作用

我有一个 Oracle 查询,它使用“WHERE something BETWEEN FROM 和 TO”可以正常工作,如果 from/to 不一样,但是当它们是时,它不起作用。


我尝试在 PHP 上验证 from/to 是否相同,然后我更改查询,将 BETWEEN 替换为“WHERE something = date”,但它也不起作用。


这是我提到的带有 PHP 验证的查询:


<?php


$db   = "(DESCRIPTION=(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 191.238.210.61)(PORT = 1521)))(CONNECT_DATA=(SID=opera)))";

$conn = oci_connect("opera", "opera", $db);


if (!$conn):

#--- Si no hay conexión, muestra error y detiene la depuración

    $m = oci_error();

    echo $m['message'];

elseif ($desde == $hasta):

    $consulta = "

                            SELECT

                                CONFIRMATION_NO,

                                NATIONALITY_DESC,

                                GUEST_NAME,

                                ADULTS,

                                CHILDREN,

                                RATE_CODE,

                                TRACE_ON,

                                DEPT_ID,

                                SUM(ADULTS) OVER()

                                || ' ADULTOS Y '

                                || SUM(CHILDREN) OVER()

                                || ' NIÑOS' AS RESULT


输出示例:(使用 BETWEEN '05-SEP-19' 和 '10-SEP-19'):


145580  EE.UU   JAMES LANTZKE   3   0   ALLIN5NMT   05/09/19    HK  6 ADULTOS Y 0 NIÑOS

167410  EE.UU   KATHARINE BLOOD 3   0   ALLIN5NMT   05/09/19    HK  6 ADULTOS Y 0 NIÑOS

概括:

  1. 如果我做一个(在'05-SEP-19'和'10-SEP-19'之间)它会起作用

  2. 如果我做一个 (BETWEEN '05-SEP-19' 和 '05-SEP-19') 不起作用

  3. 如果我做 (trace_on = '05-SEP-19') 不起作用

我想知道如何使用 BETWEEN 查询同一天或获取搜索特定日期的结果的方法。

提前致谢!


慕勒3428872
浏览 386回答 2
2回答

潇湘沐

日期始终具有以下组成部分:年、月、日、小时、分钟和秒。用户界面并不总是显示所有这些组件(但它们仍然始终存在)。如果您的TRACE_ON列有日期2019-09-05T12:34:56并且您正在尝试查看它是否是,BETWEEN '05-SEP-19' AND '05-SEP-19'那么 Oracle 将(假设匹配NLS_DATE_FORMAT会话参数)将字符串转换为午夜的日期并且2019-09-05T12:34:56 BETWEEN 2019-09-05T00:00:00 AND 2019-09-05T00:00:00为假,因此不会返回该行。将您的查询更改为:SELECT&nbsp; &nbsp; &nbsp; &nbsp;-- ...&nbsp; &nbsp; &nbsp; &nbsp;TO_CHAR( TRACE_ON, 'YYYY-MM-DD HH24:MI:SS' ),&nbsp; &nbsp; &nbsp; &nbsp;-- ...&nbsp;FROM (&nbsp; SELECT&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -- ...&nbsp; FROM&nbsp; &nbsp; GUEST_RSV_TRACES&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; INNER JOIN NAME_RESERVATION&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ON ( guest_rsv_traces.resv_name_id = name_reservation.resv_name_id )&nbsp; WHERE&nbsp; &nbsp;trace_on >= TO_DATE( '$desde', 'DD-MON-RR' )&nbsp; AND&nbsp; &nbsp; &nbsp;trace_on <&nbsp; TO_DATE( '$hasta', 'DD-MON-RR' ) + INTERVAL '1' DAY&nbsp; AND&nbsp; &nbsp; &nbsp;-- ...&nbsp; GROUP BY&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -- ...)

慕标琳琳

如果要与这些“日期”进行比较的列是DATE数据类型,则不应将其与strings进行比较,因为'05-SEP-19'(以及所有其他值)是字符串,而不是日期。不要依赖隐式转换 - 使用to_date函数或日期文字。例如:between date '2019-09-05' and date '2019-09-05'或(假设您的 NLS 设置设置为英语)between to_date('05-sep-19', 'dd-mon-rr') and to_date('05-sep-19', 'dd-mon-rr')因为,如果你做对了,那么在预期的工作之间。看一看:SQL> create table test (id, datum) as&nbsp; 2&nbsp; &nbsp; select 1, date '2019-09-04' from dual union all&nbsp; 3&nbsp; &nbsp; select 2, date '2019-09-05' from dual union all&nbsp; &nbsp;--> this ...&nbsp; 4&nbsp; &nbsp; select 3, date '2019-09-05' from dual union all&nbsp; &nbsp;--> ... and this are between 05.09.2019 and 05.09.2019&nbsp; 5&nbsp; &nbsp; select 4, date '2019-09-06' from dual;Table created.SQL> alter session set nls_date_Format = 'dd.mm.yyyy';Session altered.SQL> select * From test&nbsp; 2&nbsp; where datum between date '2019-09-05' and date '2019-09-05';&nbsp; &nbsp; &nbsp; &nbsp; ID DATUM---------- ----------&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;2 05.09.2019&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3 05.09.2019SQL>
打开App,查看更多内容
随时随地看视频慕课网APP