【问题标题】:Oracle Sql matching date column to sysdate errorOracle Sql 将日期列匹配到 sysdate 错误
【发布时间】:2013-03-17 14:21:52
【问题描述】:

我正在尝试匹配来自不同表的列,使用SYSDATE 将它们与今天的日期匹配。输出实际上是在所有行上使用今天的日期填充日期列,而不是仅在其中实际包含今天日期的一行。

SELECT building.building_code, 
    building.building_name, 
    room_booking.booking_date
FROM building,
     room_booking,
     dual
WHERE to_date(booking_date) = trunc(sysdate)

输出是:

BUILDING_CODE BUILDING_NAME   BOOKING_DATE
------------- --------------- ------------
A             ARCADIA         <17-mar-13>  
B             BELIZE          <17-mar-13>  
C             CAMDEN          <17-mar-13>  
D             DENVER          <17-mar-13>  
E             EXETER          <17-mar-13>  
F             FORT PORTAL     <17-mar-13>  
G             GRAMPIAN        <17-mar-13>  
H             HELVITICA       <17-mar-13>  
I             INVICTA         <17-mar-13>  
J             JULIET          <17-mar-13>  

10 rows selected 

结果中应该只有一行,因为只有 1 行包含今天的日期。我哪里出错了?

【问题讨论】:

  • 你的两个表需要一个连接条件(你不需要dual)。
  • 感谢垫子 - 现已删除双重功能
  • 为什么TO_DATE 周围有booking_date?是字符串吗?

标签: sql oracle select sysdate


【解决方案1】:

这是因为您没有加入表 room_bookingbuilding,在其上生成笛卡尔积。

SELECT 
    b.building_code, 
    b.building_name, 
    r.booking_date
FROM building b
        JOIN room_booking   r /* missing join condition here: ON r.building_code = b.building_code */
WHERE 
    TO_DATE(r.booking_date) = TRUNC(SYSDATE)

【讨论】:

  • 注意隐式日期格式转换错误。如果会话执行alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS';,此代码将不起作用。您可能想使用TRUNC(r.booking_date) 而不是TO_DATE(r.booking_date)
猜你喜欢
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多