年和月的条件

时间:2014-09-25 17:28:32

标签: sql ms-access where

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

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

我尝试过不同的方式(在两个值之间,对它们进行仲裁),但它始终存在值,结果集不包含这些值。

应该如何看待查询?

5 个答案:

答案 0 :(得分:2)

以下内容如何:

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

答案 1 :(得分:1)

看起来你想要:

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

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

    year_field month_field 编入索引后,此查询应比将CDateFormat应用于每一行的替代方法快得多该表,从而放弃了从索引检索中获益的任何机会。

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

答案 2 :(得分:0)

您应该将所有相关参数的两部分转换为实际日期,并在其上使用BETWEEN。

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

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

答案 3 :(得分:0)

你没有定义你的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)

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

答案 4 :(得分:0)

我曾经一度大喊,因为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盗取的基本代码