是否可以根据特定值自动创建查询?

时间:2018-11-16 05:33:07

标签: mysql database phpmyadmin

是否可以选择一个星期几来创建多个查询?

MYSQL查询:

create table reservations (
  id bigint(20) NOT NULL,
  var_start datetime NOT NULL, 
  var_end  datetime NOT NULL
)

例如

var_day   = "3"   // Wednesday 
var_month = "11"  // November 
var_year  = "2018" 
var_start = "11:00”   // 11 am
var_end   = "13:00”  // 1 pm

//This will create all inserts according all wednesday on november 2018.
insert into table var_start = "07-11-2018 11:00:00" var_end = "07-11-2018 13:00:00"
insert into table var_start = "14-11-2018 11:00:00" var_end = "07-11-2018 13:00:00”
insert into table var_start = "21-11-2018 11:00:00" var_end = "07-11-2018 13:00:00”
insert into table var_start = "28-11-2018 11:00:00" var_end = "07-11-2018 13:00:00”

这里是html demo

我会喜欢一些链接或概念,以搜索有关自动查询或此类概念的正确信息。

谢谢。

1 个答案:

答案 0 :(得分:4)

基本上,我们将动态生成查询本身内的所有必需日期。然后使用该结果集将其插入到reservations表中。

我已将id列更改为“主键和自动增量”(应该如此)。

Derived table中,我们将使用0到4之间的数字生成器,因为一个月中最多可以有5个星期三(和其他工作日)。

现在,我们将尝试获取所需月份的第一个星期日。为此,我们将首先使用月份和年份的输入变量值来创建与月份的第一天相对应的日期:

STR_TO_DATE(CONCAT('2018','11','01'), '%Y%c%d')

Concat('2018','11','01')基本生成20181101字符串。然后,我们可以使用Str_to_date()函数将其转换为MySQL date format。我们可以直接使用Concat()函数来获取YYYY-MM-DD格式;但是如果输入的月份是9而不是09,则这种方法应该很可靠。

现在,我们将使用各种Datetime functions确定第n 周三。我已经扩展了最初在这里给出的答案:https://stackoverflow.com/a/13405764/2469308

数字生成器表将帮助我们计算第1个,第2个,第3个星期三,依此类推。通过将第3个天数加到第一个星期日,我们基本上可以得到第一个星期三。之后,我们基本上每次都会增加7天,以达到每月的下一个星期三。

最终,我们将使用所有这些日期和AddTime()来分别确定var_startvar_end。此外,还有可能在第五天越过下个月。因此,我们将使用WHERE MONTH(..) .. AND YEAR(..) ..条件将其过滤掉。

最后,INSERT INTO.. SELECT语句将用于插入reservations表中。

模式(MySQL v5.7)View on DB Fiddle

create table reservations (
  id bigint(20) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  var_start datetime NOT NULL, 
  var_end  datetime NOT NULL
);

/*
var_day   = "3"   // Wednesday 
var_month = "11"  // November 
var_year  = "2018" 
var_start = "11:00”   // 11 am
var_end   = "13:00”  // 1 pm
*/

查询#1

INSERT INTO reservations (var_start, var_end)
SELECT
  ADDTIME(dates.nth_date, '11:00') AS var_start, 
  ADDTIME(dates.nth_date, '13:00') AS var_end 
FROM 
(
SELECT
  STR_TO_DATE(CONCAT('2018','11','01'), '%Y%c%d') + 
  INTERVAL (6 - 
            WEEKDAY(STR_TO_DATE(CONCAT('2018','11','01'), '%Y%c%d')) + 
            3 + 
           (7*nth)) DAY AS nth_date 
FROM 
(SELECT 0 AS nth UNION ALL
 SELECT 1 UNION ALL
 SELECT 2 UNION ALL
 SELECT 3 UNION ALL
 SELECT 4) AS num_gen
) AS dates
WHERE MONTH(dates.nth_date) = 11 AND 
      YEAR(dates.nth_date) = 2018;

查询#2

SELECT * FROM reservations;

| id  | var_start           | var_end             |
| --- | ------------------- | ------------------- |
| 1   | 2018-11-07 11:00:00 | 2018-11-07 13:00:00 |
| 2   | 2018-11-14 11:00:00 | 2018-11-14 13:00:00 |
| 3   | 2018-11-21 11:00:00 | 2018-11-21 13:00:00 |
| 4   | 2018-11-28 11:00:00 | 2018-11-28 13:00:00 |

就输入变量而言(对于参数查询,其前缀为:),查询将如下所示:

INSERT INTO reservations (var_start, var_end)
SELECT
  ADDTIME(dates.nth_date, :var_start) AS var_start, 
  ADDTIME(dates.nth_date, :var_end) AS var_end 
FROM 
(
SELECT
  STR_TO_DATE(CONCAT(:var_year,:var_month,'01'), '%Y%c%d') + 
  INTERVAL (6 - 
            WEEKDAY(STR_TO_DATE(CONCAT(:var_year,:var_month,'01'), '%Y%c%d')) + 
            :var_day + 
           (7*nth)) DAY AS nth_date 
FROM 
(SELECT 0 AS nth UNION ALL
 SELECT 1 UNION ALL
 SELECT 2 UNION ALL
 SELECT 3 UNION ALL
 SELECT 4) AS num_gen
) AS dates
WHERE MONTH(dates.nth_date) = :var_month AND 
      YEAR(dates.nth_date) = :var_year;