【问题标题】:sql query for fetching correct year获取正确年份的sql查询
【发布时间】:2014-01-29 14:34:43
【问题描述】:

我有这样的结构表

      ID    From_Year  From_Month  To_Year    To_Month    int
      1     2011        4          2012            3        8    
      2     2012        4          2013            3       8.6   
      3     2013        4          2014            3       8     
      4     2014        4          2014            8       8     
      5     2014        9          2015            3       8    

当提供月份和年份时,我需要从该表中获取正确的行 对于前

1-2012 行 ID 1

5-2013 行 ID 3

我有查询

   select * from tbl_fin where 
         (
           (From_month <=1 and From_Year =2014)  OR
           (To_month >= 1 and To_Year =2014)
         )

这里 1 是月份,2014 是年份

但它不适用于 1-2014 年

你能推荐其他选择吗

【问题讨论】:

  • 这些是您的确切列名吗?如果是这样,那是您的问题 - 他们会希望在您的定义中与您的查询中相同(并且它们是区分大小写的)
  • “正确的行”是什么意思?假设 From_y,From_m 是 start_date,to_y to_m 是 end_date 你想读什么?所有在某个日期之前开始并在之后结束的记录?从某一年开始或在某一年结束的所有记录?上面的查询选择在 2014 年 1 月之前或期间开始或在 2014 年 1 月之后或之后结束的所有记录。
  • @odedsh 表示月 = 1 和年 = 2012 正确的 ID 是 1,月 = 5 和年 = 2013 的正确 ID 是 3
  • 您想要给定日期在 FROM_MONTH/FROM_YEAR 和 TO_MONTH/TO_YEAR 之间的记录。到目前为止,上述工作的唯一原因是因为您每年有约 1 条记录。按照@MaGnetas 给出的答案。转换为日期/数字以获得更有效的解决方案如果单个记录跨越 3 年,它将起作用.. 或者如果某年有每月记录

标签: mysql sql


【解决方案1】:

你可以试试这个方法:

SELECT
    *
FROM
    tablename
WHERE
    CONCAT(from_y, LPAD(from_m, 2, 0)) <= '201201' AND
    CONCAT(to_y, LPAD(to_m, 2, 0)) >= '201201'

虽然效率不高。 基本上,您将开始日期和结束日期转换为 YYYYMM 格式,然后对它们进行字符串比较。

LPAD(val, 2, 0) 确保您的 val 为 2 位长,如果需要,添加前导零。 CONCAT 将年份值与左侧填充的月份值连接到单个字符串中。

然后你需要确保所需的日期(我从你的例子中取 201201)在 from 和 to 值之间。

更多关于:

LPAD

CONCAT

【讨论】:

  • 以上是正确的方法..你可以用数字而不是字符串来做:SELECT * From tbl_fin Where (*100+) Between (FROM_Y*100 + FROM_M) AND (TO_Y*100 + TO_M)
  • 好主意。我相信这也会更快,因为不需要字符串比较(和其他字符串操作)
  • 我真的建议走@odedsh 建议的方式。这是相同的基本思想,但更“轻量级”的解决方案。
【解决方案2】:

select * from tablname where (to_year=2014 and to_month>1 and from_year

【讨论】:

  • 我不相信这会在两种给定情况下返回正确的结果(2012 年 1 月或 2013 年 5 月)
  • select * from tablname where (to_year=2014 and to_month>1 and from_year=1 and to_year>2014)
  • 如果从年/月为 2012/01 到年/月为 2015/05 并且所需日期为 2013/07,该怎么办?这不会解决问题
  • 而不是to_year=2014 放到to_year
猜你喜欢
  • 2016-04-25
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 2021-06-27
  • 2011-02-23
  • 2012-05-16
  • 1970-01-01
  • 2019-08-24
相关资源
最近更新 更多