我有一个包含年份和月份列的数据表。我将这些值存储为数字,如2014年1月和2014年1月等,
现在,我想选择2014-01和f之间的所有值。即2015-5。
我尝试过不同的方式(在两个值之间,对它们进行仲裁),但它始终存在值,结果集不包含这些值。
应该如何看待查询?
答案 0 :(得分:2)
以下内容如何:
SELECT * FROM MyTable m
WHERE CDate(m.month & "/1/" & m.year) Between #1/1/2014# AND #5/1/2015#
答案 1 :(得分:1)
看起来你想要:
如果这是正确的,您可以要求Access直接向您提供这些数据......而无需先将年份和月份字段转换为日期值。
SELECT *
FROM datatable
WHERE
year_field = 2014
OR
(
year_field = 2015 AND month_field <= 5
);
将 year_field 和 month_field 编入索引后,此查询应比将CDate
或Format
应用于每一行的替代方法快得多该表,从而放弃了从索引检索中获益的任何机会。
另一方面,如果你的桌子足够小,你可能不会注意到可怕的低效率。 : - )
答案 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盗取的基本代码