我正在尝试查询我的表格以返回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);
非常感谢任何帮助。非常感谢你!
答案 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