【问题标题】:SQL Selecting Dates January to July if current date is less than or equal to July如果当前日期小于或等于七月,则 SQL 选择从一月到七月的日期
【发布时间】:2013-07-20 19:28:24
【问题描述】:

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

【问题讨论】:

  • 你写过SQL吗?我们希望您向我们展示您的尝试,以便我们提供帮助。就目前而言,没有表结构、示例输入和示例输出,帮助您并不容易。
  • 您使用的是什么数据库(Oracle、MySQL 等)
  • 我正在使用 mySQL。现在,我只是选择所有内容,无论年份如何,SELECT * FROM Lessons_Schedule WHERE Type="ballroom"
  • 我可以在 php 中更轻松地做到这一点,但我需要能够提取月份和年份。我做了一些研究,发现了 YEAR 函数。这是我正在尝试做的一个小样本。 SELECT * FROM Lessons_Schedule WHERE YEAR(Date)=YEAR(CURDATE()) 从那里我可以在我的 php 中使用查询来对月份做同样的事情,但是语法不起作用。就像我说的那样,我只编程了一段时间,所以这是全新的。有什么我想念的吗?
  • @theUnicycleGuy 在你的日期列上使用YEAR() 函数,如果你有一个索引,MySql 就不可能在该列上使用索引(并且你应该因为你在该列上进行过滤)有效地强制进行全面扫描.

标签: mysql sql date


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

【讨论】:

    【解决方案2】:

    对于 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)

    【讨论】:

    • @theUnicycleGuy 有帮助吗?您的问题需要更多帮助吗?
    • 我把它复制进去并用我自己的替换了表名和列名,没有运气。在 php MyAdmin 的 SQL 终端中,它一直以红色突出显示 CURDATE() 和 DATE_FORMAT() 等函数。在这一点上,我可能对这些东西不知所措。这是我的第一个 SQL 项目
    猜你喜欢
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    相关资源
    最近更新 更多