2017-09-23 105 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的不想要的行。

祝你好運。

相關問題