Mysql 尝试使用DATEADD和getting函数不存在错误
我有一个表Mysql 尝试使用DATEADD和getting函数不存在错误,mysql,sql,phpmyadmin,Mysql,Sql,Phpmyadmin,我有一个表TableName,它包含大约5000行。它由一个产品标识和一个计划时间组成 我想对这个表做的是替换ScheduleTime的每个值,不管它当前是什么。每个记录的新值ScheduleTime应设置为上一个记录的20分钟后的指定值,但以下情况除外。如果被提名人ScheduleTime发生在22:30:00之后或05:00:00之前(即太迟或太早),则应将其设置为下一个可用日期时间 我应该能够指定ScheduleTime的第一个新值 这是我目前正在使用的查询 UPDATE TableNam
TableName
,它包含大约5000行。它由一个产品标识
和一个计划时间
组成
我想对这个表做的是替换ScheduleTime
的每个值,不管它当前是什么。每个记录的新值ScheduleTime
应设置为上一个记录的20
分钟后的指定值,但以下情况除外。如果被提名人ScheduleTime
发生在22:30:00
之后或05:00:00
之前(即太迟或太早),则应将其设置为下一个可用日期时间
我应该能够指定ScheduleTime
的第一个新值
这是我目前正在使用的查询
UPDATE TableName
SET ScheduleTime = DATEADD( MI, ScheduleTime, 20 )
WHERE CAST( ScheduleTime AS TIME ) >= '22:30:00'
OR CAST( ScheduleTime AS TIME ) < '05:00:00';
此查询可用于创建我拥有的表
CREATE TABLE IF NOT EXISTS TableName
(
product_id VARCHAR( 255 ) NOT NULL,
ScheduleTime DATETIME NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我使用以下示例数据填充上表
INSERT INTO TableName ( product_id,
ScheduleTime )
VALUES ( '01', '2017-05-07 22:00:59' ),
( '02', '2017-05-07 09:09:59' ),
( '03', '2017-05-07 09:59:59' ),
( '04', '2017-05-07 09:49:59' ),
( '05', '2017-05-07 23:09:59' ),
( '06', '2017-05-07 23:09:59' ),
( '07', '2017-05-07 23:09:59' ),
( '08', '2017-05-07 23:09:59' ),
( '09', '2017-05-07 23:09:59' ),
( '10', '2017-05-07 23:09:59' ),
( '11', '2017-05-07 23:09:59' ),
( '12', '2017-05-07 23:09:59' ),
( '13', '2017-05-07 23:09:59' ),
( '14', '2017-05-07 23:09:59' ),
( '15', '2017-05-07 23:09:59' ),
( '16', '2017-05-07 23:09:59' ),
( '17', '2017-05-07 23:09:59' ),
( '18', '2017-05-07 23:09:59' ),
( '19', '2017-05-07 23:09:59' ),
( '20', '2017-05-07 23:09:59' );
请尝试以下方法
SET @workingScheduleTime := ( SELECT DATE_ADD( '2017-05-06 22:00:59', INTERVAL -20 MINUTE ) );
UPDATE TableName
JOIN ( SELECT product_id,
CASE
WHEN TIME( DATE_ADD( @workingScheduleTime, INTERVAL 20 MINUTE ) ) NOT BETWEEN '05:00:01' and '22:29:59' THEN
@workingScheduleTime := DATE_ADD( TIMESTAMP( DATE( @workingScheduleTime ), '05:00:01' ), INTERVAL 1 DAY )
ELSE
@workingScheduleTime := DATE_ADD( @workingScheduleTime, INTERVAL 20 MINUTE )
END AS ScheduleTime
FROM TableName
) AS redatedList ON TableName.product_id = redatedList.product_id
SET TableName.ScheduleTime = redatedList.ScheduleTime;
此解决方案通过循环遍历每个记录,并将20
分钟
添加到前一条记录的ScheduleTime
字段的给定值。它还允许指定ScheduleTime
的初始值。因此,我们需要从ScheduleTime
的工作值开始,即在初始值之前20
minutes
,这样循环的第一次迭代将返回初始值。因此,我的解决方案从以下语句开始
SET @workingScheduleTime := ( SELECT DATE_ADD( '2017-05-06 22:00:59', INTERVAL -20 MINUTE ) );
在初始化我们的工作值后,我根据Eric在中找到的解决方案,使用SELECT
语句对表TableName
进行了更新。声明如下
UPDATE TableName
JOIN ( SELECT product_id,
CASE
WHEN TIME( DATE_ADD( @workingScheduleTime, INTERVAL 20 MINUTE ) ) NOT BETWEEN '05:00:01' and '22:29:59' THEN
@workingScheduleTime := DATE_ADD( TIMESTAMP( DATE( @workingScheduleTime ), '05:00:01' ), INTERVAL 1 DAY )
ELSE
@workingScheduleTime := DATE_ADD( @workingScheduleTime, INTERVAL 20 MINUTE )
END AS ScheduleTime
FROM TableName
) AS redatedList ON TableName.product_id = redatedList.product_id
SET TableName.ScheduleTime = redatedList.ScheduleTime;
此语句首先在TableName
的一个实例与以下子查询的结果之间执行内部联接,该联接基于它们的product\u id
共享值
SELECT product_id,
CASE
WHEN TIME( DATE_ADD( @workingScheduleTime, INTERVAL 20 MINUTE ) ) NOT BETWEEN '05:00:01' and '22:29:59' THEN
@workingScheduleTime := DATE_ADD( TIMESTAMP( DATE( @workingScheduleTime ), '05:00:01' ), INTERVAL 1 DAY )
ELSE
@workingScheduleTime := DATE_ADD( @workingScheduleTime, INTERVAL 20 MINUTE )
END AS ScheduleTime
FROM TableName
此子查询为TableName
中的每个记录选择product\u id
的值,然后检查工作值的下一个值是否会在提问者禁止的太迟/太早的时间范围内出现。如果是,则下一个可接受的时间(05:00:01
在第二天)由CASE
语句选择。如果指定值在可接受的时间范围内,则由CASE
语句选择。工作值已更新
然后,CASE
语句选择的值作为子查询的新值ScheduleTime
如上所述,子查询的结果随后以这样的方式连接到TableName
,即TableName
的每个现有记录都有效地附加了它的新值。SET
语句使用这个新建立的关系将ScheduleTime
的每个现有值更改为相应的新值
此答案是针对使用问题中的CREATE
语句创建并使用以下脚本填充的数据集进行测试的
INSERT INTO TableName ( product_id,
ScheduleTime )
VALUES ( '01', '2017-05-07 22:00:59' ),
( '02', '2017-05-07 09:09:59' ),
( '03', '2017-05-07 09:59:59' ),
( '04', '2017-05-07 09:49:59' ),
( '05', '2017-05-07 23:09:59' ),
( '06', '2017-05-07 23:09:59' ),
( '07', '2017-05-07 23:09:59' ),
( '08', '2017-05-07 23:09:59' ),
( '09', '2017-05-07 23:09:59' ),
( '10', '2017-05-07 23:09:59' ),
( '11', '2017-05-07 23:09:59' ),
( '12', '2017-05-07 23:09:59' ),
( '13', '2017-05-07 23:09:59' ),
( '14', '2017-05-07 23:09:59' ),
( '15', '2017-05-07 23:09:59' ),
( '16', '2017-05-07 23:09:59' ),
( '17', '2017-05-07 23:09:59' ),
( '18', '2017-05-07 23:09:59' ),
( '19', '2017-05-07 23:09:59' ),
( '20', '2017-05-07 23:09:59' );
我的代码结果已由提问者确认
进一步阅读
(在MySQL的介于
和之间,而不是介于
运算符之间)
(在MySQL的DATE()
函数上)
(在MySQL的DATE\u ADD()函数上)
(在MySQL的SET
语句中)
(在MySQL的TIME()
函数上)
(在MySQL的TIMESTAMP()函数上)
(在MySQL的UPDATE
语句中)请尝试以下操作
SET @workingScheduleTime := ( SELECT DATE_ADD( '2017-05-06 22:00:59', INTERVAL -20 MINUTE ) );
UPDATE TableName
JOIN ( SELECT product_id,
CASE
WHEN TIME( DATE_ADD( @workingScheduleTime, INTERVAL 20 MINUTE ) ) NOT BETWEEN '05:00:01' and '22:29:59' THEN
@workingScheduleTime := DATE_ADD( TIMESTAMP( DATE( @workingScheduleTime ), '05:00:01' ), INTERVAL 1 DAY )
ELSE
@workingScheduleTime := DATE_ADD( @workingScheduleTime, INTERVAL 20 MINUTE )
END AS ScheduleTime
FROM TableName
) AS redatedList ON TableName.product_id = redatedList.product_id
SET TableName.ScheduleTime = redatedList.ScheduleTime;
此解决方案通过循环遍历每个记录,并将20
分钟
添加到前一条记录的ScheduleTime
字段的给定值。它还允许指定ScheduleTime
的初始值。因此,我们需要从ScheduleTime
的工作值开始,即在初始值之前20
minutes
,这样循环的第一次迭代将返回初始值。因此,我的解决方案从以下语句开始
SET @workingScheduleTime := ( SELECT DATE_ADD( '2017-05-06 22:00:59', INTERVAL -20 MINUTE ) );
在初始化我们的工作值后,我根据Eric在中找到的解决方案,使用SELECT
语句对表TableName
进行了更新。声明如下
UPDATE TableName
JOIN ( SELECT product_id,
CASE
WHEN TIME( DATE_ADD( @workingScheduleTime, INTERVAL 20 MINUTE ) ) NOT BETWEEN '05:00:01' and '22:29:59' THEN
@workingScheduleTime := DATE_ADD( TIMESTAMP( DATE( @workingScheduleTime ), '05:00:01' ), INTERVAL 1 DAY )
ELSE
@workingScheduleTime := DATE_ADD( @workingScheduleTime, INTERVAL 20 MINUTE )
END AS ScheduleTime
FROM TableName
) AS redatedList ON TableName.product_id = redatedList.product_id
SET TableName.ScheduleTime = redatedList.ScheduleTime;
此语句首先在TableName
的一个实例与以下子查询的结果之间执行内部联接,该联接基于它们的product\u id
共享值
SELECT product_id,
CASE
WHEN TIME( DATE_ADD( @workingScheduleTime, INTERVAL 20 MINUTE ) ) NOT BETWEEN '05:00:01' and '22:29:59' THEN
@workingScheduleTime := DATE_ADD( TIMESTAMP( DATE( @workingScheduleTime ), '05:00:01' ), INTERVAL 1 DAY )
ELSE
@workingScheduleTime := DATE_ADD( @workingScheduleTime, INTERVAL 20 MINUTE )
END AS ScheduleTime
FROM TableName
此子查询为TableName
中的每个记录选择product\u id
的值,然后检查工作值的下一个值是否会在提问者禁止的太迟/太早的时间范围内出现。如果是,则下一个可接受的时间(05:00:01
在第二天)由CASE
语句选择。如果指定值在可接受的时间范围内,则由CASE
语句选择。工作值已更新
然后,CASE
语句选择的值作为子查询的新值ScheduleTime
如上所述,子查询的结果随后以这样的方式连接到TableName
,即TableName
的每个现有记录都有效地附加了它的新值。SET
语句使用这个新建立的关系将ScheduleTime
的每个现有值更改为相应的新值
此答案是针对使用问题中的CREATE
语句创建并使用以下脚本填充的数据集进行测试的
INSERT INTO TableName ( product_id,
ScheduleTime )
VALUES ( '01', '2017-05-07 22:00:59' ),
( '02', '2017-05-07 09:09:59' ),
( '03', '2017-05-07 09:59:59' ),
( '04', '2017-05-07 09:49:59' ),
( '05', '2017-05-07 23:09:59' ),
( '06', '2017-05-07 23:09:59' ),
( '07', '2017-05-07 23:09:59' ),
( '08', '2017-05-07 23:09:59' ),
( '09', '2017-05-07 23:09:59' ),
( '10', '2017-05-07 23:09:59' ),
( '11', '2017-05-07 23:09:59' ),
( '12', '2017-05-07 23:09:59' ),
( '13', '2017-05-07 23:09:59' ),
( '14', '2017-05-07 23:09:59' ),
( '15', '2017-05-07 23:09:59' ),
( '16', '2017-05-07 23:09:59' ),
( '17', '2017-05-07 23:09:59' ),
( '18', '2017-05-07 23:09:59' ),
( '19', '2017-05-07 23:09:59' ),
( '20', '2017-05-07 23:09:59' );
我的代码结果已确认为