mysql - 是否可以根据特定值自动创建查询?
问题描述
是否可以选择星期几创建多个查询?
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演示
我将欣赏一些链接或概念来搜索有关自动查询或此类概念的正确信息。
提前致谢。
解决方案
我们将基本上在查询本身中动态生成所有必需的日期。然后使用该结果集插入到reservations
表中。
我已将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
数字生成表将帮助我们计算第一个、第二个、第三个星期三等等。我们基本上可以通过在第一个星期日加上 3 天来得到第一个星期三。之后,我们基本上每次都会增加7天,以获取该月的下周三。
最终,我们将使用所有这些日期并对AddTime()
它们进行相应的确定var_start
和确定var_end
。另外,第5天有可能跨越到下个月。所以我们将使用WHERE MONTH(..) .. AND YEAR(..) ..
条件过滤掉那些。
最后,INSERT INTO.. SELECT
语句将用于插入到reservations
表中。
Schema (MySQL v5.7)在 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;
推荐阅读
- python - 在 Tkinter 中设置画布大小的正确方法是什么?
- c++ - C ++如何按单词输入并计算我输入了多少单词
- php - docker-compose:构建镜像但使用另一个镜像
- html - 滚动条高度小于 div 的高度
- scala - 在 Spark Scala 中迭代数据框列 Array of Array
- python - 使用 Python 函数动态创建 dcc.Dropdown 值
- python - 在 Python 中比较日期并为新列创建值
- http - 为什么 HTTP 标头响应可以在 Go 中的调用函数中更新?
- assembly - 为什么我们需要堆栈的红区?
- json - oracle 12.1如何解析key-value json?