Oracle在日期与Microsoft之间的日期之间

时间:2013-06-26 13:19:15

标签: sql oracle

当我从Microsoft Query查询时,我得到了正确的结果但是当我从SQLPLUS(Oracle)查询时,我得到的结果不正确。

以下是Microsoft Query(结果显示从6月12日下午3点到6月13日上午12点正确。

SELECT 
      NAME,
      CIM,
      NUM_of_People,
      STARTDATETIME
From Table
WHERE (SUSTAINED_FLAG=1) 
AND (PLANNED_FLAG=0) 
AND (STARTDATETIME>{ts '2013-06-12 04:00:00'} 
And STARTDATETIME<{ts '2013-06-13 12:00:00'})



在Oracle中我使用这个条款给我错误的结果。
它显示了 仅在6月13日12:AM到12 PM之后查询日期结果。

SELECT 
        NAME,
        CIM,
        NUM_of_People,
        TO_CHAR(STARTDATETIME,'MM/DD/YYYY HH:MI:SS') As STARTDATETIME
FROM OBVWH.  
where  BETWEEN To_Date(to_char(STARTDATETIME, 'DD-MON-YYYY')) >= To_Date('06/12/2013 16:00:00','MM/DD/YYYY HH24:MI:SS') 
and To_Date(to_char(STARTDATETIME, 'DD-MON-YYYY')) <= To_Date('06/13/2013 12:00:00','MM/DD/YYYY HH24:MI:SS') 
and sustained_flag = 1 and planned_flag = 0 ORDER BY STARTDATETIME ASC

1 个答案:

答案 0 :(得分:4)

您遇到此问题的原因是因为where子句

To_Date(to_char(STARTDATETIME, 'DD-MON-YYYY'))

正在做的是从您的约会中删除时间元素,以便它们全部在午夜有效。

就是一个简单的例子
SELECT CASE
       WHEN to_date(to_char(SYSDATE, 'DD-MON-YYYY')) = SYSDATE THEN
        'yes'
       ELSE
        'no'
   END
FROM   dual

正如您所看到的,在更改两次格式后,sysdate不再等于它自己。

由于该列是一个日期,您根本不需要对其进行任何格式化,只需将您的where子句更改为

where  STARTDATETIME >= To_Date('06/12/2013 16:00:00','MM/DD/YYYY HH24:MI:SS') 
and    STARTDATETIME <= To_Date('06/13/2013 12:00:00','MM/DD/YYYY HH24:MI:SS') 
and sustained_flag = 1 and planned_flag = 0 ORDER BY STARTDATETIME ASC