как я могу удалить дату в этой таблице? - PullRequest
5 голосов
/ 26 августа 2010

У меня есть такой стол

create table tbl_1(
  year int,
  month int, 
 day int
)

insert into tbl_1 values(2009,  11, 30)
insert into tbl_1 values(2010,   3,  4)
insert into tbl_1 values(2011,   5, 13)
insert into tbl_1 values(20011, 12, 24)

Я хочу удалить дату с 2009-11-30 до 2011-5-13, но не могу, потому что все столбцы имеют тип int, и я не могу использовать этот запрос:

delete from tbl_1 
 where year >=2009 
   and year<=2011 
   and month >=11 
   and month <=5 
   and day >=30 
   and day <=13

.. потому что: 1 <месяц <12 и 1 <день <30 </p>

Я знаю, что это ужасная ошибка.

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

Ответы [ 5 ]

7 голосов
/ 26 августа 2010

Вы можете сделать это так:

DELETE FROM tbl_1 
WHERE (year * 10000 + month * 100 + day) BETWEEN 20091130 AND 20110513

Я не проверял это. Я бы рекомендовал сначала протестировать его на тестовой системе, а затем запускать на производственных данных, чтобы случайно не удалить неправильные данные.

4 голосов
/ 26 августа 2010

В MySQL и PostgreSQL:

DELETE
FROM    tbl_1
WHERE   (2009, 11, 30) <= (year, month, date)
        AND (year, month, date) <= (2011, 5, 13)

В PostgreSQL вы даже можете сделать:

DELETE
FROM    tbl_1
WHERE   (year, month, date) BETWEEN (2009, 11, 30) AND (2011, 5, 13)
3 голосов
/ 26 августа 2010

Просто используйте еще несколько логических операторов:

DELETE FROM tbl_1
WHERE (year = 2009 AND (month > 11 OR (month = 11 AND day >= 30)))
OR year = 2010
OR (year = 2011 AND (month < 5 OR (month = 5 AND day <= 13)))

Не красиво, но работает.

Редактировать:

параметризовано:

DELETE FROM tbl_1
WHERE (year = %minYear% AND (month > %minMonth% OR (month = %minMonth% AND day >= %minDay%)))
OR (year > %minYear% AND year < %maxYear%)
OR (year = %maxYear% AND (month < %maxMonth% OR (month = %maxMonth% AND day <= %maxDay%)))
0 голосов
/ 26 августа 2010

Самый простой способ сделать это - использовать DATE_FORMAT. Вот так:

...
WHERE DATE_FORMAT( CONCAT(year,"-",month,"-",day), '%Y-%m-%d' ) > "2009-11-30"
AND DATE_FORMAT( CONCAT(year,"-",month,"-",day), '%Y-%m-%d' ) < "2011-05-13"

Надеюсь, это поможет! : -)

0 голосов
/ 26 августа 2010

Преобразуйте столбцы в дату в предложении where, тогда:

DELETE tbl_1
WHERE CONVERT(DATETIME, CONVERT(VARCHAR(4), year) + '-' + convert(VARCHAR(2), month) + '-' + CONVERT(VARCHAR(2), day)) BETWEEN '20091130' AND '20110513'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...