在Oracle中寻找时间时,“月中的某一天必须介于1月和最后一天之间”

时间:2016-05-26 16:12:47

标签: mysql date datetime

这可能相当简单,但我不知道如何解决这个问题。

所以这是一个我正在做的简单查询:

perform

现在,如果我执行完全相同的查询删除“AND TIME = '00:00'”,一切正常,但如果我尝试搜索TIME,则会抛出以下错误:

SELECT TO_CHAR(DATE,'DD-MM-YYYY') AS DATE, TO_CHAR(TIME,'HH24:MI') AS TIME,
CODEROOM, GROUP0, GROUP1, GROUP2, GROUP3,
FROM CONCERTS
WHERE DATE = '20-05-16' AND TIME = '00:00'  AND CODEROOM = '1'

我知道我可以在同一列时间和日期进行分组,我尝试过,但我也无法修复它。

我真的不知道如何解决这个问题,我知道这可能是因为Oracle中的DATE存储了DATE和TIME,并且尽管时间还不错,它可能会有一个无效的DATE,但如果是这样的话,则会出现错误将在执行查询时抛出,我甚至无法执行它(我还检查了日期是否有效)

有什么方法可以解决这个问题吗?我一直在抬头,似乎无法找到解决方案

提前多多感谢:)

3 个答案:

答案 0 :(得分:1)

首先,您可能首先要更改列定义,以便拥有有意义的名称,例如CONCERT_DATECONCERT_TIME

其次,您需要在where子句中应用相同的to_char函数 以及..

SELECT TO_CHAR(DATE,'DD-MM-YYYY') AS CONCERT_DATE, TO_CHAR(TIME,'HH24:MI') AS CONCERT_TIME,
CODEROOM, GROUP0, GROUP1, GROUP2, GROUP3,
FROM CONCERTS
WHERE TO_CHAR(DATE,'DD-MM-YYYY') = '20-05-2016' 
  AND TO_CHAR(TIME,'HH24:MI') = '00:00'  
  AND CODEROOM = '1'

答案 1 :(得分:1)

正如我在评论中解释的那样,你不能在where中使用别名。您需要将函数复制为@cableload,或使用子查询

SELECT *
FROM (
       SELECT To_char(date, 'DD-MM-YYYY') AS D, 
              To_char(time, 'HH24:MI')    AS T, 
              coderoom, 
              group0,  group1, 
              group2,  group3, 
       FROM   concerts 
       WHERE  coderoom = '1' 
     ) foo
WHERE  foo.D = '20-05-2016' -- here you had YY instead of YYYY
  AND  foo.T = '00:00' 

并且不要使用DATETIME之类的保留字作为别名/ fieldname

答案 2 :(得分:0)

您的日期文字需要采用ISO-8601格式,即'2016-05-20'而不是'20-05-16'