SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.04.2011 12:54:28

mangust
Участник
Зарегистрирован: 04.04.2011
Сообщений: 15

Удаление значений из базы данных

Существует база данных входа и выхода работников через турникет на предприятии, нужно удалить значения из базы данных по определённому временному промежутку, например - человек пришёл на работу в 7:48 а потом выходил и входил несколько раз до обеда (12:30). Эти значения требуется удалить.
В аттаче скрин.
(Прошу прощения возможно объясняю не так, совсем недавно начал работать с SQl, знаний маловато-учусь).
Какую информацию ещё нужно предоставить для помощи?


Прикрепленные файлы:
Attachment Icon 04.04.jpg, Размер: 247,201 байт, Скачано: 481

Неактивен

 

#2 04.04.2011 14:29:20

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Удаление значений из базы данных

Давайте попробуем сначала от частного к общему smile.

Если Вы хотите удалить, допустим, записи о вхождениях/выхождениях за 5 апреля 2010 года с половины первого дня до трех часов дня, то такой запрос должен помочь:

delete from `НАЗВАНИЕ_ВАШЕЙ_ТАБЛИЦЫ` where `DATE`='2010-04-05' and (`time`>='12:30:00' and `time`<'15:00:00');


mangust написал:

Какую информацию ещё нужно предоставить для помощи?

Опишите остальные поля на всякий случай, если будете еще что-то спрашивать. И когда приводите таблицу, то сильно облегчает, если приводите ее структуру (результат запроса

show create table `ИМЯ_ВАШЕЙ_ТАБЛИЦЫ`
).

Отредактированно deadka (04.04.2011 14:30:21)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 04.04.2011 14:54:17

mangust
Участник
Зарегистрирован: 04.04.2011
Сообщений: 15

Re: Удаление значений из базы данных

deadka написал:

Если Вы хотите удалить, допустим, записи о вхождениях/выхождениях за 5 апреля 2010 года с половины первого дня до трех часов дня, то такой запрос должен помочь:

немного неправильно я объяснил нужно удалять в определённом временном промежутке значения по табельному номеру (tab_n) пропуска, каждый работник проходит по магнитной кнопке, которая считывает его, и заносит в базу данных.

CREATE TABLE `passage` (
`key` int(11) NOT NULL AUTO_INCREMENT,
`tab_n` int(11) DEFAULT '0',
`ID_PASS` varchar(50) DEFAULT NULL,
`N_GAT` int(11) DEFAULT NULL,
`time` time DEFAULT NULL,
`DATE` varchar(10) DEFAULT NULL,
`CODE` tinyint(4) DEFAULT NULL,
`DIR` bit(1) DEFAULT NULL,
`NEW` bit(1) DEFAULT b'1',
`MOMENT` double DEFAULT NULL,
PRIMARY KEY (`key`),
KEY `time` (`time`),
KEY `tab_n` (`tab_n`),
KEY `date` (`DATE`),
KEY `dir` (`DIR`),
KEY `ID_PASS` (`ID_PASS`)
) ENGINE=InnoDB AUTO_INCREMENT=733880 DEFAULT CHARSET=latin1

Если возможно укажите пожалуйста ваш ICQ, хотелось бы с Вами пообщаться... smile

Отредактированно mangust (04.04.2011 14:55:48)

Неактивен

 

#4 04.04.2011 14:58:58

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Удаление значений из базы данных

mangust написал:

немного неправильно я объяснил нужно удалять в определённом временном промежутке значения по табельному номеру (tab_n) пропуска, каждый работник проходит по магнитной кнопке, которая считывает его, и заносит в базу данных.

Ну, то есть, видимо, почти то же самое, просто еще ставим

delete from `passage` where `tab_n`='НУЖНЫЙ_НОМЕР_tab_n' and `DATE`='2010-04-05' and (`time`>='12:30:00' and `time`<'15:00:00');




mangust написал:

Если возможно укажите пожалуйста ваш ICQ, хотелось бы с Вами пообщаться... smile

Все возможно, но чем Вам не нравится способ общения на форуме smile?

Отредактированно deadka (04.04.2011 14:59:42)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 04.04.2011 15:05:26

mangust
Участник
Зарегистрирован: 04.04.2011
Сообщений: 15

Re: Удаление значений из базы данных

deadka написал:

mangust написал:

немного неправильно я объяснил нужно удалять в определённом временном промежутке значения по табельному номеру (tab_n) пропуска, каждый работник проходит по магнитной кнопке, которая считывает его, и заносит в базу данных.

Ну, то есть, видимо, почти то же самое, просто еще ставим

delete from `passage` where `tab_n`='НУЖНЫЙ_НОМЕР_tab_n' and `DATE`='2010-04-05' and (`time`>='12:30:00' and `time`<'15:00:00');


Да спасибо, всё отлично, то что надо. smile Так же вопрос на изменение существующего значения какой должен быть запрос?

mangust написал:

Если возможно укажите пожалуйста ваш ICQ, хотелось бы с Вами пообщаться... smile

Все возможно, но чем Вам не нравится способ общения на форуме smile?

Нет, всё нравится, просто хотел пообщаться, да и так, иногда спросить не у кого, совет нужен. smile

Отредактированно mangust (04.04.2011 15:06:02)

Неактивен

 

#6 04.04.2011 15:11:18

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Удаление значений из базы данных

mangust написал:

Так же вопрос на изменение существующего значения какой должен быть запрос?

Какое именно значение Вы хотите изменить? И какое условие на изменение?

http://dev.mysql.com/doc/refman/5.0/en/update.html
http://www.mysql.ru/docs/man/UPDATE.html


mangust написал:

Нет, всё нравится, просто хотел пообщаться, да и так, иногда спросить не у кого, совет нужен. smile

Ну так и спрашивайте на форуме, чем сможем - поможем.

Отредактированно deadka (04.04.2011 15:12:48)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 04.04.2011 15:46:28

mangust
Участник
Зарегистрирован: 04.04.2011
Сообщений: 15

Re: Удаление значений из базы данных

После запроса строки не удаляет...
delete from `passage` where `tab_n`='2021' and `DATE`='2011-04-04' and (`time`>='12:30:00' and `time`<'15:00:00');

Удалено строк: 0. ( запрос занял 0.0011 сек. )

Отредактированно mangust (04.04.2011 15:48:29)

Неактивен

 

#8 04.04.2011 15:49:38

mangust
Участник
Зарегистрирован: 04.04.2011
Сообщений: 15

Re: Удаление значений из базы данных

Собственно нашёл ошибку, формат времени по другому прописывать...

delete from `passage` where `tab_n`='2021' and `DATE`='04.04.2011' and (`time`>='8:00:00' and `time`<'12:00:00')

Неактивен

 

#9 04.04.2011 17:02:15

mangust
Участник
Зарегистрирован: 04.04.2011
Сообщений: 15

Re: Удаление значений из базы данных

deadka написал:

mangust написал:

Так же вопрос на изменение существующего значения какой должен быть запрос?

Какое именно значение Вы хотите изменить? И какое условие на изменение?

http://dev.mysql.com/doc/refman/5.0/en/update.html
http://www.mysql.ru/docs/man/UPDATE.html

изменение значения DATE и time на нужное из таблицы рассмотренной выше...

Неактивен

 

#10 04.04.2011 17:13:20

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Удаление значений из базы данных

Критерий какие именно строки изменять я так и не понял.

Попробуйте так (например, меняем там, где tab_n=10):

update `passage` set `DATE`='НУЖНАЯ_ДАТА', `time`='НУЖНОЕ_ВРЕМЯ' where `tab_n=10`;


И не вздумайте послать запрос без условия where - поменяет все записи сразу - и назад не вернешь потом. Так что тренироваться тут явно стоит на тестовых данных smile.

Отредактированно deadka (04.04.2011 17:15:19)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 04.04.2011 17:24:15

mangust
Участник
Зарегистрирован: 04.04.2011
Сообщений: 15

Re: Удаление значений из базы данных

deadka написал:

Критерий какие именно строки изменять я так и не понял.

Попробуйте так (например, меняем там, где tab_n=10):

update `passage` set `DATE`='НУЖНАЯ_ДАТА', `time`='НУЖНОЕ_ВРЕМЯ' where `tab_n=10`;


И не вздумайте послать запрос без условия where - поменяет все записи сразу - и назад не вернешь потом. Так что тренироваться тут явно стоит на тестовых данных smile.

Да всё отлично получилось, спасибо.

Неактивен

 

#12 13.04.2011 15:05:03

mangust
Участник
Зарегистрирован: 04.04.2011
Сообщений: 15

Re: Удаление значений из базы данных

Вопрос похожего плана, но боюсь ошибиться, в этой же базе SQL описанной выше, требуется удалить все значения выхода и входа до 01.12.2010, какая команда должна быть? Так же требуется создать резервную копию до удаления...

Неактивен

 

#13 13.04.2011 16:27:03

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Удаление значений из базы данных

Для того, чтобы создать резервную копию нужно создать таблицу с той же структурой

CREATE TABLE `passage_reserve_copy` (
`key` int(11) NOT NULL AUTO_INCREMENT,
`tab_n` int(11) DEFAULT '0',
`ID_PASS` varchar(50) DEFAULT NULL,
`N_GAT` int(11) DEFAULT NULL,
`time` time DEFAULT NULL,
`DATE` varchar(10) DEFAULT NULL,
`CODE` tinyint(4) DEFAULT NULL,
`DIR` bit(1) DEFAULT NULL,
`NEW` bit(1) DEFAULT b'1',
`MOMENT` double DEFAULT NULL,
PRIMARY KEY (`key`),
KEY `time` (`time`),
KEY `tab_n` (`tab_n`),
KEY `date` (`DATE`),
KEY `dir` (`DIR`),
KEY `ID_PASS` (`ID_PASS`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


и вставить туда значения из старой.

insert into `passage_reserve_copy` select * from `passage`;


Рекомендую делать это всякий раз перед серьезными изменениями- удалениями/обновлениями ).

mangust написал:

требуется удалить все значения выхода и входа до 01.12.2010

А каков признак входа/выхода? DIR?
Если так, то посмотрите вот эти запросы:


delete from `passage` where `DATE`<'01.12.2010';
delete from `passage` where `DATE`<'01.12.2010' and DIR=1;
delete from `passage` where `DATE`<'01.12.2010' and DIR=0;
 


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#14 13.04.2011 16:35:17

mangust
Участник
Зарегистрирован: 04.04.2011
Сообщений: 15

Re: Удаление значений из базы данных

deadka, благодарю, Вы очень помогли!

Отредактированно mangust (13.04.2011 16:35:28)

Неактивен

 

#15 13.04.2011 16:36:23

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: Удаление значений из базы данных

Осторожно!

DATE - об'явлен как строка:

`DATE` varchar(10) DEFAULT NULL


а значит под условие:
delete from `passage` where `DATE`<'05.09.2010';

попадут также строки:
'04.10.2010', '05.04.2011',...

и НЕпопадут такие строки:
'10.08.2010', '05.10.2009',...

Неактивен

 

#16 13.04.2011 17:16:44

mangust
Участник
Зарегистрирован: 04.04.2011
Сообщений: 15

Re: Удаление значений из базы данных

vaspet написал:

Осторожно!

DATE - об'явлен как строка:

`DATE` varchar(10) DEFAULT NULL


а значит под условие:
delete from `passage` where `DATE`<'05.09.2010';

попадут также строки:
'04.10.2010', '05.04.2011',...

и НЕпопадут такие строки:
'10.08.2010', '05.10.2009',...

а как возможно сделать что бы и эти даты были учтены и за 2011 не учтены?

Неактивен

 

#17 13.04.2011 19:29:03

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: Удаление значений из базы данных

В поле 'DATE' хранит' действител'но дату (тип DATE)
или если всеже строкой, то в формате "ГОД МЕСЯЦ ДЕНь" чтобы сравнение строк происходило в правил'ном порядке (от 0 до конца строки)

Неактивен

 

#18 13.04.2011 22:01:47

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Удаление значений из базы данных

Ох, слона-то я и не приметил! vaspet абсолютно прав. То-то думаю, странно, что дата хранится в формате dd.mm.yyyy...

mangust, с этим полем DATE действительно стоит "разобраться".
У него должен быть тип не varchar, а тип date (а вообще, если честно, то лучше бы наверное положить поля date и time в одно поле datetime и  с ним уже работать) и в этом случае сравнение будет работать как положено, и удалится ровно то, что должно удалиться.

Как это сделать:

1) преобразовать строку `DATE` в нужный формат - yyyy-mm-dd
В том случае, если у Вас в поле `DATE` всегда четко отведено под день и месяц по два символа, а на год 4 годится вот такой запрос:

update `passage` set `DATE`=concat(SUBSTRING(`DATE`,7,4),'-',SUBSTRING(`DATE`,4,2),'-',SUBSTRING(`DATE`,1,2));


Иначе будет конструкция посложнее - с функциями locate, substring и прочее.

Проверить это в-общем-то нетрудно -

select length(`DATE`),`DATE` from `passage` order by 1 asc;
select length(`DATE`),`DATE` from `passage` order by 1 desc;
 


2) Изменить тип поля
ALTER TABLE `passage` MODIFY COLUMN `DATE` DATE NOT NULL;

Отредактированно deadka (13.04.2011 22:08:05)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#19 16.04.2011 15:15:53

mangust
Участник
Зарегистрирован: 04.04.2011
Сообщений: 15

Re: Удаление значений из базы данных

Собственно немного почитав документацию и проанализировав ответы форумчан сделал немного другим способом:

1. Бэкап сделал через экспорт, phpMySQL
2. Удаление значений за 2010 год сделал так - delete from passage where passage.date like '%.2011'; т.к. date текстовое, то использовал LIKE

Спасибо всем за помощь

Неактивен

 

#20 16.04.2011 15:19:49

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Удаление значений из базы данных

Я все же категорически рекомендую преобразовать тип `DATE` в date из varchar - этим Вы обезопасите себя (и своих последователей) от потенциальных ошибок.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#21 16.04.2011 15:23:53

mangust
Участник
Зарегистрирован: 04.04.2011
Сообщений: 15

Re: Удаление значений из базы данных

deadka написал:

Я все же категорически рекомендую преобразовать тип `DATE` в date из varchar - этим Вы обезопасите себя (и своих последователей) от потенциальных ошибок.

Да я понимаю, но дело в том что программа (которая и заносит значения в базу данных с турникетов) на отказ не хочет работать с типом varchar.

Неактивен

 

#22 16.04.2011 15:25:59

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Удаление значений из базы данных

Не понял Вас - так я и предлагаю использовать тип date вместо типа varchar.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#23 16.04.2011 15:28:18

mangust
Участник
Зарегистрирован: 04.04.2011
Сообщений: 15

Re: Удаление значений из базы данных

deadka написал:

Не понял Вас - так я и предлагаю использовать тип date вместо типа varchar.

да, прошу прощения, описался - программа не хочет воспринимать тип date.

Неактивен

 

#24 16.04.2011 15:30:03

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Удаление значений из базы данных

Интересно, что ж за программа такая smile. Ну тогда следите аккуратно за всеми операциями с полем `DATE` smile...


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#25 16.04.2011 15:34:22

mangust
Участник
Зарегистрирован: 04.04.2011
Сообщений: 15

Re: Удаление значений из базы данных

"Автоматизированное рабочее место управления проходной" - Decagon

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson