【问题标题】:where condition for year and month年份和月份的条件
【发布时间】:2014-09-26 02:33:52
【问题描述】:

我有一个包含年份和月份列的数据表。我将这些值存储为数字,例如 2014 年和 2014 年 1 月的 1 等。

现在,我想选择 2014-01 和 f 之间的所有值。 e. 2015 年 5 月。

我尝试了不同的方法(在两个值之间,连接它们),但它始终存在值,结果集不包含这些值。

查询应该怎么看?

【问题讨论】:

  • 几个问题:您使用的是什么数据库?月份和年份列是什么数据类型?大多数数据库都有特定的日期数据类型,因此您不必进行花哨的计算来获取范围。如果您没有利用您的 DATE 数据类型,您可能需要研究一下。
  • 我用的是ms访问,月份和年份列是整数。
  • 感谢您的回复。最后,我在表中插入了一个新列,其中存储了相应年份和月份的第一个日期。

标签: sql ms-access where


【解决方案1】:

以下内容如何:

SELECT * FROM MyTable m
WHERE CDate(m.month & "/1/" & m.year) Between #1/1/2014# AND #5/1/2015#

【讨论】:

    【解决方案2】:

    看来你想要:

    1. 2014 年的所有数据
    2. 2015 年 1 月至 5 月的数据

    如果正确,您可以要求 Access 直接向您提供这些数据...而无需先将您的年份和月份字段转换为日期值。

    SELECT *
    FROM datatable
    WHERE
        year_field = 2014
        OR
        (
            year_field = 2015 AND month_field <= 5
        );
    

    使用 year_fieldmonth_field 索引,此查询应该比将 CDateFormat 应用于表的每一行的替代方法快得多,从而放弃任何从索引检索中受益的机会。

    另一方面,如果您的桌子足够小,您可能不会注意到这种可怕的低效率。 :-)

    【讨论】:

    • 只要他有正确的数据类型。 ;o) 否则 10、11 和 12 将返回(当这些月份的数据输入数据库时​​)。
    • 他说“月份和年份列都是整数”.
    【解决方案3】:

    你没有定义你的 RBDMS,所以我假设你使用 ORACLE,你当然可以改变语法。

    SELECT *
    FROM [table]
    WHERE (SELECT to_date(to_char(year) || '/' || to_char(month) || '/01', 'yyyy/mm/dd')
           FROM dual)
    BETWEEN (SELECT to_date('year/mm/01', 'yyyy/mm/dd' FROM dual)
    AND (SELECT to_date('year2/mm2/01', 'yyyy/mm/dd' FROM dual)
    

    未经测试。 请注意,您需要将 year 和 mm 替换为开始日期,将 year2 和 mm2 替换为结束日期。

    【讨论】:

    • OP 正在使用 MS Access。您的查询在 MS Access 中不起作用。
    • 在阅读他使用 MS 访问权限之前,我正在写这篇文章。请阅读我回答的第一行。
    • @fmbesteiro,我确实阅读了您的答案,就像您应该先阅读问题和 cmets 一样。 derstauner 在您发布答案前 9 分钟表示他/她正在使用 MS Access。
    • 我在几分钟前就开始写答案了,只是我AFK然后完成并发布。
    【解决方案4】:

    我有一次被大喊大叫,因为between 显然不安全,所以你可能更喜欢

    SELECT *
    FROM MYTABLE AS m
    WHERE Format(m.month & "/1/" & m.year,"mm/dd/yyyy") >=
          Format(#1/1/2014#,"mm/dd/yyyy") AND
          Format(m.month & "/1/" & m.year,"mm/dd/yyyy") <=
          Format(#5/1/2015#,"mm/dd/yyyy")
    

    还有从 Linger 窃取的基本代码

    【讨论】:

      【解决方案5】:

      您应该将所有涉及的参数的两个部分转换为实际日期,并在它们上使用 BETWEEN。

      SELECT [field_list]
      FROM [table_name] t
      WHERE CDate(t.year + '/' + t.month + '/02') 
        BETWEEN #2014/01/01# 
            AND #2014/05/03#;
      

      如果您有一个实际的日期字段,您可以使用它,但为了简单起见,假设您没有使用日期,上述设置应该适合您。

      【讨论】:

      • convert() 在 MS Access 中无效。
      • 您的查询仍然无效。因为它会产生 Data type mismatch 错误。
      猜你喜欢
      • 2016-11-05
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 2016-07-31
      • 1970-01-01
      • 2022-12-07
      • 2016-06-25
      相关资源
      最近更新 更多