【问题标题】:How to write a query to get data within a period range?如何编写查询以获取期间范围内的数据?
【发布时间】:2012-05-21 14:40:08
【问题描述】:

我有一个员工表,其中包含类似

的列
emp_id, firstname, lastname, month  and year.

现在我需要从 2012 年 1 月2012 年 3 月 之间的表中获取 employees
monthyear 列中,我们为 jan 存储“1”,为 March 存储“3”,即月份数字和年份列的年份类似于 2012 .
请帮忙。

【问题讨论】:

  • 提示:Oracle 有一个 DATE 数据类型,您应该将月份和年份列存储在该数据类型的一列中。只需将天设置为 1 并将小时、分钟和秒设置为 0。您的查询将变得更加容易,并且您可以更好地为新列建立索引。

标签: sql oracle


【解决方案1】:

2012 年 1 月至 2012 年 3 月期间的员工:

select * from employee
where year = 2012 and month between 1 and 3

2012 年 1 月至 2013 年 3 月期间的员工:

select * from employee
where (year = 2012 and month between 3 and 12)
or (year = 2013 and month between 1 and 3)

【讨论】:

  • 感谢您的回答。但是,如果我需要获取 2012 年 3 月到 2013 年 3 月之间的数据怎么办?
  • 我将有四个输入,如 start_month、start_year、end_month 和 end_year 到 where 子句。这将基于用户的选择。
  • @Ahish select * from employee where (year BETWEEN start_year AND end_year and month between start_month and end_month) OR (year>start_year AND year
  • @JonasT 这不适用于 2011 年 10 月到 2013 年 3 月的范围。
  • @yhw42(year>start_year AND year
【解决方案2】:

我认为您最好在进行选择之前将所有内容都转换为日期时间。我个人更喜欢单个日期时间列而不是单独的“月”和“年”列,但如果你不能那样做,这样的事情会起作用:

SELECT * FROM employees 
 WHERE CAST( CAST(year AS VARCHAR(4)) +
            RIGHT('0' + CAST(month AS VARCHAR(2)), 2) +
            '00'
            AS DATETIME)
BETWEEN
    CAST( CAST(start_year AS VARCHAR(4)) +
            RIGHT('0' + CAST(start_month AS VARCHAR(2)), 2) +
            '00'
            AS DATETIME)
AND
    CAST( CAST(end_year AS VARCHAR(4)) +
            RIGHT('0' + CAST(end_month AS VARCHAR(2)), 2) +
            '00'
            AS DATETIME)

不幸的是,这有点难看。也许可以通过在选择语句之前将开始和结束日期转换为日期时间并将它们存储在变量中来清理它?

【讨论】:

    【解决方案3】:
    SELECT * 
    FROM  employee
    WHERE to_char(year,0000) + to_char(month,00) BETWEEN '201201' AND '201203'
    

    【讨论】:

    • 此查询在 where 子句中出现“缺少表达式”错误。
    • 抱歉,我不知道您使用的是 Oracle。我的查询在 SQL 中运行良好,您可以采用将年份和月份组合为格式为 YYYYMM 的字符串的概念,然后与您的值进行比较
    【解决方案4】:

    你好,这可能对你有帮助,

     select * from emp
    where to_date(concat('1-',concat(concat(month,'-'), year)),'DD-MM-YY') 
          between to_date('1-&month-&year' ,'DD-MM-YY') 
    and   to_date('1-&month-&year' ,'DD-MM-YY') ;
    

    我将每个月和年的值转换为指定格式的数据并进行比较。

    【讨论】:

      猜你喜欢
      • 2019-11-21
      • 1970-01-01
      • 2018-06-27
      • 2017-02-28
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 2014-06-27
      • 1970-01-01
      相关资源
      最近更新 更多