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

3qpi33ja  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(250)

可以创建多个查询来选择星期几吗?
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演示
我将感谢一些链接或概念,以搜索有关自动查询或这类概念的正确信息。
提前谢谢。

wgx48brx

wgx48brx1#

我们将基本上在查询本身中动态生成所有必需的日期。然后使用该结果集插入 reservations table。
我变了 id 列到主键并自动递增(按原样)。
在派生表中,我们将使用从0到4的数字生成器,因为一个月最多可以有5个星期三(和其他工作日)。
现在我们将尝试获取所需月份的第一个星期日。为此,我们将首先使用月份和年份的输入变量值创建与月份的第一个日期相对应的日期:

STR_TO_DATE(CONCAT('2018','11','01'), '%Y%c%d')
``` `Concat('2018','11','01')` 基本上产生 `20181101` 字符串。然后我们可以使用 `Str_to_date()` 函数将其转换为mysql日期格式。我们本来可以用的 `Concat()` 直接进入 `YYYY-MM-DD` 格式;但是,这种方法应该是健壮的,以防输入月份不稳定 `9` 而不是 `09` .
现在,我们将使用各种datetime函数来确定第n个星期三。我已经扩展了最初在这里给出的答案:https://stackoverflow.com/a/13405764/2469308
数字生成器表将帮助我们计算第1、2、3个星期三等。。我们可以在第一个星期天的基础上再加上3天,基本上得到第一个星期三。之后,我们将基本上增加7天,每次得到下周三在这个月。
最终,我们将使用所有这些日期和时间 `AddTime()` 让他们决定 `var_start` 以及 `var_end` 相应地。另外,也有可能在第5天,它可能跨越到下个月。所以我们将使用 `WHERE MONTH(..) .. AND YEAR(..) ..` 条件。
最后, `INSERT INTO.. SELECT` 语句将用于插入 `reservations` table。
db fiddle上的schema(mysql v5.7)视图

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;

idvar_startvar_end
12018-11-07 11:00:002018-11-07 13:00:00
22018-11-14 11:00:002018-11-14 13:00:00
32018-11-21 11:00:002018-11-21 13:00:00
42018-11-28 11:00:002018-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;

相关问题