Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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 尝试使用DATEADD和getting函数不存在错误_Mysql_Sql_Phpmyadmin - Fatal编程技术网

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' );
我的代码结果已确认为