Mysql 在SQL中选择不带日期字段的日期范围
我有一个MySQL数据库,其中包含一个Mysql 在SQL中选择不带日期字段的日期范围,mysql,date-parsing,Mysql,Date Parsing,我有一个MySQL数据库,其中包含一个year字段和一个week\u number字段。这些只是INT字段。我希望能够执行一个查询,在基于周数和年份的日期范围内进行选择,例如: SELECT * FROM table WHERE year BETWEEN 2000 AND 2002 AND week_number BETWEEN 50 AND 10 但显然,这是失败的,因为查询中没有日期和时间的概念。我可以通过对输入数据进行一点解析,将这个特定示例拆分为三个单独的查询: SELECT * FR
year
字段和一个week\u 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
如果需要添加这3个查询结果,即选择2000弱50和2002弱10之间的所有查询,请使用
或:
SELECT * FROM table WHERE (year = 2000 AND week_number >= 50) OR year = 2001 OR (year = 2002 AND week_number <= 10)
从表中选择*,其中(年份=2000,周数>=50)或年份=2001或(年份=2002,周数这是您想要的吗
SELECT * FROM table WHERE (year = 2000 AND week_number >= 50)
OR (year = 2001)
OR ( year = 2002 AND week_number <= 10)
从表中选择*,其中(年份=2000,周数>=50)
或(年份=2001)
或(年份=2002年和周数)
用您的日期替换我的开始日期和结束日期
更新
再想一想,您可能需要在整个星期内使用带零的左pad,并将所有字符串转换为整数,因此查询变成:
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)
DROP TABLE my_TABLE;
创建表my_表(val1 INT NOT NULL,val2 INT NOT NULL,主键(val1,val2));
在我的表格中插入数值(2013,48)、(2013,49)、(2013,50)、(2013,51)、(2013,52)、(2014,1)、(2014,2)、(2014,3)、(2014,5);
从my_表中选择*,其中(val1,val2)>=(2013,50)和(val1,val2)Between应该与int值一起使用。可能是您的查询逻辑失败了。@AbhikChakraborty:谢谢您的评论,但我认为Between
语句没有问题。问题是使用Between从两个单独的字段中选择日期范围失败,因为跨越了日期范围。如果不是这样,很抱歉清楚;我将更新问题以尝试更好地解释。只需看看我的解决方案,因为这是真正的解决方案。其他解决方案只是解决问题的方法:)谢谢你的回答!不幸的是,我尝试了这个方法,但它对我无效;无论我插入什么数字,它都返回零行(即使是从同一年选择的).有点像,但范围事先不知道,因此我必须以编程方式构造查询。这很好,但我感兴趣的是是否可以更“直观”地进行查询通过SQL。谢谢你的回答Volkan。就像我对@Gooner说的,只要知道日期范围就行。否则,我必须以编程方式构建它。太棒了,这正是我想要的!
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)
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 |
+------+------+