Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在SQL中选择不带日期字段的日期范围_Mysql_Date Parsing - Fatal编程技术网

Mysql 在SQL中选择不带日期字段的日期范围

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

我有一个MySQL数据库,其中包含一个
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 |
+------+------+