0

我对 sql 和编程很陌生,所以我不确定它的语法。我有一张表,我想选择给定学期中出现的每一行。营业额为 1 月 1 日和 7 月 1 日。我希望它显示当年、7 月之前或 7 月之后的所有条目,具体取决于当前月份。我的日期列是 sql 日期格式。

4

2 回答 2

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 日,我将留给您使用,以确保您不会获得第一学期的结果。一种方法是使用类似的案例陈述,但我认为有更简洁的方法。

于 2013-07-20T19:51:07.350 回答
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)

于 2013-07-20T19:53:25.370 回答