簡體   English   中英

如果當前日期小於或等於7月,則SQL選擇1月至7月的日期

[英]SQL Selecting Dates January to July if current date is less than or equal to July

一般而言,我對sql和編程技術還很陌生,所以我不確定其語法。 我有一張桌子,我想選擇在給定學期中發生的每一行。 營業額將在1月1日和7月1日。 我希望它顯示當前年份,7月之前或7月之后的所有條目,具體取決於當前月份。 我的日期列采用sql日期格式。

如果使用的是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日,我將留給您使用以確保您不會獲得第一學期的成績。 一種方法是采用類似的案例陳述,但我認為有更簡潔的方法可以做到這一點。

對於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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM