2013-07-20 81 views
0

我是一般的SQL和編程新手,所以我不確定這個語法。我有一張桌子,我想選擇在給定的學期中發生的每一行。營業額將爲1月1日和7月1日。我希望它能顯示當年7月之前或7月之後的所有條目,具體取決於當前月份。我的日期列是sql日期格式。SQL如果當前日期小於或等於7月,則選擇日期1月到7月

+0

你有寫過任何SQL可言?我們希望你向我們展示你的嘗試,所以我們可以提供幫助。就目前來看,沒有表格結構,示例輸入和輸出示例,要幫助你並不容易。 – Oded

+1

你正在使用什麼數據庫(Oracle,MySQL等) – eebbesen

+0

我正在使用mySQL。現在,我只是選擇一切,不管一年,SELECT * FROM'Lessons_Schedule' WHERE'Type' =「ballroom」 – theUnicycleGuy

回答

1

如果您使用的是Oracle,您可以在where子句中使用case語句,並利用這樣一個事實,即如果您沒有在Oracle日期明確設置一年,則它將假設當前年份。

select * 
    from your_table 
where case 
     when trunc(sysdate) > to_date('01-JUL', 'DD-MON') then 
      to_date('01-JUL', 'DD-MON') 
     else 
      to_date('01-JAN', 'DD-MON') 
     end < date_column; 

我要把它留給你使用,確保你沒有得到第一學期的結果,如果當前的日期比7月1日的大。一種方法是採用類似的案例陳述,但我認爲有更清晰的方法來做到這一點。

0

對於MySQL查詢可能看起來像

SELECT * 
    FROM Table1 
WHERE date BETWEEN CASE WHEN CURDATE() < DATE_FORMAT(CURDATE(), '%Y-08-01') 
         THEN DATE_FORMAT(CURDATE(), '%Y-01-01') 
         ELSE DATE_FORMAT(CURDATE(), '%Y-08-01') END 
       AND CASE WHEN CURDATE() < DATE_FORMAT(CURDATE(), '%Y-08-01') 
         THEN LAST_DAY(DATE_FORMAT(CURDATE(), '%Y-07-01')) 
         ELSE DATE_FORMAT(CURDATE(), '%Y-12-31') END 

它也可以被改寫爲

SELECT * 
    FROM Table1 CROSS JOIN 
(
    SELECT CASE WHEN CURDATE() < DATE_FORMAT(CURDATE(), '%Y-08-01') 
       THEN DATE_FORMAT(CURDATE(), '%Y-01-01') 
       ELSE DATE_FORMAT(CURDATE(), '%Y-08-01') END start_date, 
     CASE WHEN CURDATE() < DATE_FORMAT(CURDATE(), '%Y-08-01') 
       THEN LAST_DAY(DATE_FORMAT(CURDATE(), '%Y-07-01')) 
       ELSE DATE_FORMAT(CURDATE(), '%Y-12-31') END end_date 
) q 
WHERE date BETWEEN q.start_date AND q.end_date 

這裏是SQLFiddle演示(MySQL的)

+0

@theUnicycleGuy有幫助嗎?你的問題需要更多幫助嗎? – peterm

+0

我把它複製過來,用我自己的而且沒有運氣替換表名和列名。在php MyAdmin的SQL終端中,它一直以紅色突出顯示CURDATE()和DATE_FORMAT()等函數。在這一點上,我可能對此感到滿意。這是我第一個使用SQL的項目 – theUnicycleGuy

相關問題