2017-09-23 88 views
0

我想查询我的表返回被预定为2017年六月(06-17) 这是迄今为止我的查询“会议”:SQL查询日期只使用年份和月份

SELECT SESSIONID,SESSIONDATE,SESSIONPRICE 
FROM CONFERENCESESSION 
WHERE SESSIONDATE = TO_DATE('06-17', 'MM-YY') 
ORDER BY SESSIONDATE DESC; 

但是这不会返回任何结果。它的工作,如果我查询特定日期,例如

WHERE SESSIONDATE = TO_DATE('6-06-17', 'DD-MM-YY') 

我的表中的数据是这样的:

INSERT INTO CONFERENCESESSION VALUES ('SS01','B1','R1','S1',TO_DATE('3-05-17','DD-MM-YY'),12.50); 
INSERT INTO CONFERENCESESSION VALUES ('SS02','B2','R1','S2',TO_DATE('4-06-17','DD-MM-YY'),19.45); 
INSERT INTO CONFERENCESESSION VALUES ('SS03','B1','R2','S2',TO_DATE('13-05-17','DD-MM-YY'),12.69); 
INSERT INTO CONFERENCESESSION VALUES ('SS04','B4','R2','S4',TO_DATE('13-06-17','DD-MM-YY'),14.56); 
INSERT INTO CONFERENCESESSION VALUES ('SS05','B3','R2','S5',TO_DATE('23-05-17','DD-MM-YY'),14.56); 
INSERT INTO CONFERENCESESSION VALUES ('SS06','B3','R1','S5',TO_DATE('3-06-17','DD-MM-YY'),16.32); 
INSERT INTO CONFERENCESESSION VALUES ('SS07','B4','R2','S3',TO_DATE('13-05-17','DD-MM-YY'),21.78); 
INSERT INTO CONFERENCESESSION VALUES ('SS08','B1','R2','S2',TO_DATE('6-06-17','DD-MM-YY'),16.82); 
INSERT INTO CONFERENCESESSION VALUES ('SS09','B2','R3','S4',TO_DATE('13-05-17','DD-MM-YY'),17.90); 
INSERT INTO CONFERENCESESSION VALUES ('SS10','B4','R1','S3',TO_DATE('6-06-17','DD-MM-YY'),16.37); 

任何帮助是极大的赞赏。非常感谢 !

+0

运行'选择TO_DATE('06 -17','MM-YY')from dual;'你就会明白为什么你的查询不能像你认为的那样工作。 DATE必须有一个日期组件,并且我们不提供一个Oracle会默认它。 – APC

+0

您需要正确标记RDBMS。因为,解决方案在每个RDBMS上都不相同 – Ravi

+0

您应该更好地了解'Oracle'和'SQL Server'之间的区别。他们完全不一样。 – Ravi

回答

1

如果使用Oracle,然后使用TO_CHAR来代替。

例子:

WHERE TO_CHAR(SESSIONDATE,'MM-YY')='06-17' 

>>>Demo<<<


如果您正在使用SQL Server,您可以使用CONVERT

CONVERT(VARCHAR(4), SESSIONDATE, 12) ='1706' 

以上转换将返回为'YYMM'

+0

我试图使用TO_CHAR,但自从它在SQL服务器中,它会出现未知的命令。 ive尝试过CAST和CONVERT,但是它们都没有工作:( –

+0

你在你的问题中标记了'Oracle',你如何期待我们在'SQL SERVER'中回答? – Ravi

+0

@JamieSimpson如果你无法在SQL Server中使用'TO_CHAR' ,那么你可以解释一下吗?你是如何执行插入查询的,它有'TO_DATE'? – Ravi

0

您可以提取月份和年份并将其传递到where子句中。你写的查询如下,

SELECT SESSIONID,SESSIONDATE,SESSIONPRICE, EXTRACT (Month from SESSIONDATE) as SESSIONDATE_Month,EXTRACT (Year from SESSIONDATE) as SESSIONDATE_Year from CONFERENCESESSION 
WHERE EXTRACT (Month from SESSIONDATE) = 06 and EXTRACT (Year from SESSIONDATE) = 2017 
ORDER BY SESSIONDATE DESC; 
-1

假设你的表包含以下数据(使用MS SQL服务器2016):

SS01 B1 R1 S1 03/05/2017 00:00:00 12.50 
SS02 B2 R1 S2 04/06/2017 00:00:00 19.45 
SS03 B1 R2 S2 13/05/2017 00:00:00 12.69 
SS04 B4 R2 S4 13/06/2017 00:00:00 14.56 
SS05 B3 R2 S5 23/05/2017 00:00:00 14.56 
SS06 B3 R1 S5 03/06/2017 00:00:00 16.32 
SS07 B4 R2 S3 13/05/2017 00:00:00 21.78 
SS08 B1 R2 S2 06/06/2017 00:00:00 16.82 
SS09 B2 R3 S4 13/05/2017 00:00:00 17.90 
SS10 B4 R1 S3 06/06/2017 00:00:00 16.37 

你可以使用一个查询,看起来有点像......

select sessionid sid_, sessiondate date_, sessionprice price_ 
from cs 
where month(sessiondate) = 6 
and year(sessiondate) = 2017 
order by sessiondate desc; 

输出(全“六一”节)

sid_ date_    price_ 
SS04 13/06/2017 00:00:00 14.56 
SS08 06/06/2017 00:00:00 16.82 
SS10 06/06/2017 00:00:00 16.37 
SS02 04/06/2017 00:00:00 19.45 
SS06 03/06/2017 00:00:00 16.32 

dbfiddle here.

+0

'MONTH'和'YEAR'不是Oracle的功能。 – MT0

+0

@MTO:我知道。显然,有一些混淆 - 这个问题被标记为“Oracle”,然后OP评论说,所提出的解决方案在MS SQL下无效(请参阅Ravi的评论)。这就是为什么我添加了这个。 – stefan

1

截断日期的 “月” 级和比较的方法:

SELECT SESSIONID,SESSIONDATE,SESSIONPRICE 
    FROM CONFERENCESESSION 
    WHERE TRUNC(SESSIONDATE, 'MONTH') = TO_DATE('06-2017', 'MM-YYYY') 
    ORDER BY SESSIONDATE DESC; 

SQLFiddle here to see what the effects are

顺便说一下,这是一个非常昂贵的查询,因为您需要对表中的每一行执行一个函数。如果您没有特定的基于函数的索引来为此查询提供服务,则它可能非常缓慢。更好的方法是使用范围的查询,如下所示:

SELECT SESSIONID,SESSIONDATE,SESSIONPRICE 
    FROM CONFERENCESESSION 
    WHERE SESSIONDATE BETWEEN TO_DATE('01-06-2017', 'DD-MM-YYYY') 
         AND TO_DATE('01-07-2017', 'DD-MM-YYYY') - INTERVAL '1' SECOND 
    ORDER BY SESSIONDATE DESC; 

在这里,查询的端点('01 -06-2017' 和'01 -07-2017' )只需要计算一次 - 之后Oracle使用简单的DATE比较表现良好。

请记住,当使用BETWEEN时,端点都被认为是“在”范围内,所以我们需要从7月1日(本例中)减去1秒以确保查询不会收到任何在7月的第一个会议中有一个SESSIONDATE的不想要的行。

祝你好运。

相关问题