SQL仅使用月份和年份查询日期

时间:2017-09-23 04:50:30

标签: sql oracle

我正在尝试查询我的表格以返回2017年6月预订的“会话”。(06-17) 这是我到目前为止的查询:

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);

非常感谢任何帮助。非常感谢你!

4 个答案:

答案 0 :(得分:1)

如果您使用的是Oracle,请改用TO_CHAR

示例:

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

<强> >>>Demo<<<

如果您使用的是SQL Server,则可以使用 CONVERT

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

以上转化将返回'YYMM'

答案 1 :(得分: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日减去一秒,以确保查询不在7月的第一天用SESSIONDATE获取任何不需要的行。

祝你好运。

答案 2 :(得分: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;

答案 3 :(得分:-1)

假设您的表包含以下数据(使用MS SQL server 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;

输出(所有&#34;六月和#34;会话)

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.