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