繁体   English   中英

在SQL中选择没有DATE字段的日期范围

[英]Selecting a date range in SQL without a DATE field

我有一个MySQL数据库,其中包含year字段和week_number字段。 这些只是INT字段。 我希望能够执行查询,以便根据周数和年份在包含范围的日期之间进行选择,例如:

SELECT * FROM table WHERE year BETWEEN 2000 AND 2002 AND week_number BETWEEN 50 AND 10

但这显然失败了,因为查询中没有日期和时间的概念。 我可以将这个特定的示例分为三个单独的查询,并进行一些输入数据的解析:

SELECT * FROM table WHERE year = 2000 AND week_number >= 50
SELECT * FROM table WHERE year = 2001
SELECT * FROM table WHERE year = 2002 AND week_number <= 10

但是我想知道是否有更有效的解决方案?

编辑

我想我可能还不清楚实际问题。 我想做的是查询一种可以获取起始年/周组合和结束年/周组合之间的所有日期的方式。 也就是说,在上面的查询中,我希望返回以下行:

Year  Week Number
2000  50
2000  51
2000  52
2001   1
2001   2

(...and so on for all weeks in 2001...)

2001  51
2001  52
2002   1
2002   2

(...and so on for weeks 3-8...)

2002   9
2002  10
DROP TABLE my_table;

CREATE TABLE my_table (val1 INT NOT NULL, val2 INT NOT NULL,PRIMARY KEY(val1,val2));

INSERT INTO my_table VALUES (2013,48),(2013,49),(2013,50),(2013,51),(2013,52),(2014,1),(2014,2),(2014,3),(2014,5);

SELECT * FROM my_table WHERE (val1,val2) >= (2013,50) AND (val1,val2) <= (2014,3);
+------+------+
| val1 | val2 |
+------+------+
| 2013 |   50 |
| 2013 |   51 |
| 2013 |   52 |
| 2014 |    1 |
| 2014 |    2 |
| 2014 |    3 |
+------+------+

如果您需要添加这3个查询结果,则意味着选择2000弱50和2002弱10之间的全部,请使用OR

SELECT * FROM table WHERE (year = 2000 AND week_number >= 50) OR year = 2001 OR (year = 2002 AND week_number <= 10)

这是你想要的吗?

SELECT * FROM table WHERE (year = 2000 AND week_number >= 50)
OR (year = 2001)
OR ( year = 2002 AND week_number <= 10)
SELECT * FROM table WHERE
CONCAT(year,week_number) BETWEEN CONCAT(YEAR(MY_DATE_START),WEEKOFYEAR(MY_DATE_START))
    AND CONCAT(YEAR(MY_DATE_END),WEEKOFYEAR(MY_DATE_END))

用您的日期替换MY_DATE_STARTMY_DATE_END

更新

再次考虑,您可能需要在所有星期中都用零填充左键并将所有字符串都转换为整数,因此查询变为:

SELECT *
FROM table
WHERE CAST( CONCAT(year,LPAD(week_number,2,"0")) AS UNSIGNED )
    BETWEEN CAST( CONCAT(YEAR(MY_DATE_START),LPAD(WEEKOFYEAR(MY_DATE_START),2,"0")) AS UNSIGNED )
    AND CAST( CONCAT(YEAR(MY_DATE_END),LPAD(WEEKOFYEAR(MY_DATE_END),2,"0")) AS UNSIGNED )

您可以这样做:

SELECT 
   *
FROM table
WHERE DATE_ADD(MAKEDATE(year, 1), INTERVAL week_number WEEK) BETWEEN 
DATE_ADD(MAKEDATE(2000, 1), INTERVAL 50 WEEK) AND 
DATE_ADD(MAKEDATE(2002, 1), INTERVAL 10 WEEK)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM