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

时间:2019-08-23 20:37:53

标签: php oracle

我有一个Oracle查询,使用“在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
                            FROM
                            ( SELECT
                                MAX(CONFIRMATION_NO) AS CONFIRMATION_NO,
                                NATIONALITY_DESC,
                                GUEST_FIRST_NAME
                                || '  '
                                || GUEST_NAME GUEST_NAME,
                                MAX(ADULTS) AS ADULTS,
                                MAX(CHILDREN) AS CHILDREN,
                                RATE_CODE,
                                MIN(TRACE_ON) AS TRACE_ON,
                                LISTAGG(GUEST_RSV_TRACES.DEPT_ID, ',') WITHIN GROUP (ORDER BY NULL) AS DEPT_ID
                            FROM
                                GUEST_RSV_TRACES,
                                NAME_RESERVATION
                            WHERE trace_on = '$desde' 
                            AND guest_rsv_traces.resv_name_id = name_reservation.resv_name_id 
                            AND rate_code like 'ALL%' 
                            AND resv_status not in ('CANCELLED') 
                            AND guest_rsv_traces.dept_id not in ('TRF','OD')
                            GROUP BY
                            NATIONALITY_DESC,
                            GUEST_FIRST_NAME,
                            GUEST_NAME,
                            RATE_CODE
                            )
                            ";
    $query    = oci_parse($conn, $consulta);
    oci_execute($query);
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
                            FROM
                            ( SELECT
                                MAX(CONFIRMATION_NO) AS CONFIRMATION_NO,
                                NATIONALITY_DESC,
                                GUEST_FIRST_NAME
                                || '  '
                                || GUEST_NAME GUEST_NAME,
                                MAX(ADULTS) AS ADULTS,
                                MAX(CHILDREN) AS CHILDREN,
                                RATE_CODE,
                                MIN(TRACE_ON) AS TRACE_ON,
                                LISTAGG(GUEST_RSV_TRACES.DEPT_ID, ',') WITHIN GROUP (ORDER BY NULL) AS DEPT_ID
                            FROM
                                GUEST_RSV_TRACES,
                                NAME_RESERVATION
                            WHERE trace_on BETWEEN '$desde' and '$hasta'
                            AND guest_rsv_traces.resv_name_id = name_reservation.resv_name_id 
                            AND rate_code like 'ALL%' 
                            AND resv_status not in ('CANCELLED') 
                            AND guest_rsv_traces.dept_id not in ('TRF','OD')
                            GROUP BY
                            NATIONALITY_DESC,
                            GUEST_FIRST_NAME,
                            GUEST_NAME,
                            RATE_CODE
                            )
                            ";
    $query = oci_parse($conn, $consulta);
    oci_execute($query);
endif;
?>

输出示例:(在“ 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. 如果我这样做(在'05 -SEP-19'和'05 -SEP-19'之间进行)不起作用
  3. 如果我这样做(trace_on = '05 -SEP-19')不起作用

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

¡¡事先感谢!

2 个答案:

答案 0 :(得分: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
       -- ...
       TO_CHAR( TRACE_ON, 'YYYY-MM-DD HH24:MI:SS' ),
       -- ...
 FROM (
  SELECT
          -- ...
  FROM    GUEST_RSV_TRACES
          INNER JOIN NAME_RESERVATION
          ON ( guest_rsv_traces.resv_name_id = name_reservation.resv_name_id )
  WHERE   trace_on >= TO_DATE( '$desde', 'DD-MON-RR' )
  AND     trace_on <  TO_DATE( '$hasta', 'DD-MON-RR' ) + INTERVAL '1' DAY
  AND     -- ...
  GROUP BY
          -- ...
)

答案 1 :(得分:0)

如果要与这些“日期”进行比较的列属于driver.get("http://www.ncsl.org/research/transportation/autonomous-vehicles-legislative-database.aspx") WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[contains(@for, '_StateNetDB_ckBxAllTopics')]"))).click() driver.find_element_by_xpath("//label[contains(@for, '_StateNetDB_ckBxAllStates')]").click() 数据类型,则不应将其与字符串进行比较,因为DATE(同样和所有其他值一样)是字符串,而不是日期。不要依赖隐式转换-使用'05-SEP-19'函数或日期文字。

例如:

to_date

或(假设您的NLS设置设为英语)

between date '2019-09-05' and date '2019-09-05'

因为,如果正确执行操作,则两次之间的工作均符合预期。看看:

between to_date('05-sep-19', 'dd-mon-rr') and to_date('05-sep-19', 'dd-mon-rr')