2012-04-24 102 views
0

我正在使用Oracle 10g XE。我由Oracle SQL Developer内部有两个数据库。我正在执行此查询。在数据库中设置日期格式

SELECT SCHEDULE_ID, START_DATE, END_DATE 
    FROM SCHEDULE 
WHERE C_ID IN (5781) 
    AND START_DATE >=TO_DATE ('1/29/2012','MM/DD/YYYY') 
    AND END_DATE <=TO_DATE ('4/14/2012','MM/DD/YYYY') 

在第一个数据库中,数据正确返回。我在第二个数据库中执行相同的查询,但它不返回任何值。但数据在表中可用。

我执行的查询

SELECT dump(START_DATE), dump(END_DATE) FROM SCHEDULE WHERE C_ID=5026 

我得到的结果是,

DUMP(START_DATE) -> Typ=12 Len=7: 100,112,2,7,1,1,1 
DUMP(END_DATE) -> Typ=12 Len=7: 100,112,2,13,1,1,1 

和重要的事情是,我不应该修改query..Because其工作中的所有其他数据库...

+4

日期设置不会影响这一点。你确定你的_data_是一样的吗? – Ben 2012-04-24 10:33:42

+0

yes.sure ..我查过了。 – RobinHood 2012-04-24 10:36:35

+0

我试过这样的“.... TO_DATE(START_DATE)> = TO_DATE('1/29/2012','MM/DD/YYYY')”它的工作... ..但它不是正确的解决方案.... – RobinHood 2012-04-24 10:43:47

回答

4

你声明:

SELECT dump(START_DATE), dump(END_DATE) FROM SCHEDULE WHERE C_ID=5026 

我得到的结果是,

DUMP(START_DATE) -> Typ=12 Len=7: 100,112,2,7,1,1,1 and DUMP(END_DATE) -> Typ=12 Len=7: 100,112,2,13,1,1,1 

我的评论:

100,112,2,7,1,1,1

100,112,2,13,1 ,1,1

这导致YYYY-MM-DD

Startdate 0012-02-07 00:00:00 
Enddate  0012-02-13 00:00:00 

所以你大约有2000年过去了。

日期数据类型的格式是

byte 1 - century (excess 100) 100 - 100 = 00 
byte 2 - year (excess 100) 112 - 100 = 12 
byte 3 - month = 2 
byte 4 - day = 7 
byte 5 - hour (excess 1) 1 - 1 = 0 
byte 6 - minute (excess 1) 1 - 1 = 0 
byte 7 - seconds (excess 1) 1 - 1 = 0 
+0

嗨,我无法理解你的答案..请解释我该怎么做...... – RobinHood 2012-04-24 14:40:51

+0

转储函数显示数据库中日期的内部表示形式为100,112,2,7,1,1,1。这对应于0012-02-07。那天耶稣约12岁。从日程表中选择to_char(startdate,'YYYY-MM-DD');你会看到的。所以可能你的数据是'错误的',至少不是你期望的结果。 – 2012-04-24 14:45:31

+0

@RobinHood - 你的日期是在12年,而不是在2012年(2000年前)。如果您希望SQL语句正常工作,则需要更改数据以确保日期正确。因此,例如'update schedule set start_date = add_months(start_date,12 * 2000),end_date = add_months(end_date,12 * 2000),其中c_id = 5026'将更新这两行,以便年份正确。但是,你可能想要做一些类似'update schedule set start_date = add_months(start_date,12 * 2000)的地方start_date 2012-04-24 14:46:25