为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕勒3428872 2021-12-03 18:45:33
我有一个 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ÑOS167410  EE.UU   KATHARINE BLOOD 3   0   ALLIN5NMT   05/09/19    HK  6 ADULTOS Y 0 NIÑOS概括:如果我做一个(在'05-SEP-19'和'10-SEP-19'之间)它会起作用如果我做一个 (BETWEEN '05-SEP-19' 和 '05-SEP-19') 不起作用如果我做 (trace_on = '05-SEP-19') 不起作用我想知道如何使用 BETWEEN 查询同一天或获取搜索特定日期的结果的方法。提前致谢!
查看完整描述

2 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

日期始终具有以下组成部分:年、月、日、小时、分钟和秒。用户界面并不总是显示所有这些组件(但它们仍然始终存在)。


如果您的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

          -- ...

)


查看完整回答
反对 回复 2021-12-03
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

如果要与这些“日期”进行比较的列是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

  2    select 1, date '2019-09-04' from dual union all

  3    select 2, date '2019-09-05' from dual union all   --> this ...

  4    select 3, date '2019-09-05' from dual union all   --> ... and this are between 05.09.2019 and 05.09.2019

  5    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

  2  where datum between date '2019-09-05' and date '2019-09-05';


        ID DATUM

---------- ----------

         2 05.09.2019

         3 05.09.2019


SQL>


查看完整回答
反对 回复 2021-12-03
  • 2 回答
  • 0 关注
  • 385 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信