[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Перезаписать 30 000 значений в цикле
vagon
Нужно перезаписать 30 000 значений в строках циклом, т.е. поменять дату формата: 10.11.2010 на TIMESTAMP в базе.

код не работает:

<?php

$id=0;
while ($id < 100)
{
//$id++; // Увеличение счетчика
require_once './config.php';
$res = mysql_query("SELECT `id`,`joindate` FROM `tb_us` WHERE `id`='$id' LIMIT 1");
$exist = mysql_num_rows($res);

if($exist>0)
{
$res = mysql_fetch_assoc($res);
$id = $res['id'];
$joindate = $res['joindate'];

$access_date = $joindate;
$point1 = substr("$access_date", 2, 1);
$point2 = substr("$access_date", 5, 1);

if($point1 == '.' AND $point2 == '.' )
{
$god = substr("$access_date", 6, 4);
$mes = substr("$access_date", 3, 2);
$day = substr("$access_date", 0, 2);

$time = mktime(0,0,0,$mes,$day,$god);

mysql_query("UPDATE `tb_us` SET `joindate`='$time' WHERE `id`='".$id."' LIMIT 1");
}
}

else
{
$id++;
}

if ($id==100) break;
echo "<b>Итерация $id</b><br>";
}
?>

как сделать правильно?



Спустя 11 минут, 47 секунд (15.10.2011 - 17:30) johniek_comp написал(а):
оператор вывода так перепиши, проблему не решит, но код написан правильно будет

echo '<b>Итерация ' . $id . ' </b><br>';

Спустя 54 минуты, 37 секунд (15.10.2011 - 18:25) alex12060 написал(а):
vagon

Вах, хочешь подскажу функцию одну интересную?

Вот тебе одним SQL запросом:


UPDATE `table`
SET `joindate` = UNIX_TIMESTAMP(`joindate`)
WHERE 1;


Или прочти про это:


strtotime();

Спустя 36 минут, 16 секунд (15.10.2011 - 19:01) vagon написал(а):

UPDATE `table`
SET `joindate` = UNIX_TIMESTAMP(`joindate`)
WHERE 1;

не катит, потому что дата записана не как 2011.10.07 а зеркально: 07.10.2011

получается совершенно другая дата.

отсюда попытка сделать из говна и палок функцию на php, типа

$god = substr("$access_date", 6, 4);
$mes = substr("$access_date", 3, 2);
$day = substr("$access_date", 0, 2);
$time = mktime(0,0,0,$mes,$day,$god);

т.е. развернуть для начала дату, привести в правильный формат.

Спустя 19 минут, 1 секунда (15.10.2011 - 19:20) alex12060 написал(а):
На, поизвращайся:


select unix_timestamp(str_to_date(replace('15.10.2011', '.', ','), '%d,%m,%Y'));

select unix_timestamp('2011-10-15');


Вот подставлено:


UPDATE `table`
SET `joindate` = unix_timestamp(str_to_date(replace(`joindate`, '.', ','), '%d,%m,%Y'))
WHERE 1;

Спустя 51 минута (15.10.2011 - 20:11) killer8080 написал(а):
А если так?
UPDATE `tb_us` 
SET `joindate`=UNIX_TIMESTAMP(
CONCAT(
SUBSTRING(
`joindate`, 7, 4),
'-',
SUBSTRING(`joindate`, 4, 2),
'-',
SUBSTRING(`joindate`, 1, 2)
)
)

WHERE `joindate` REGEXP '^\d{2}\.\d{2}\.\d{4}$'

Кстати, а какой формат поля `joindate`? Хватит ли длины? Да и вообще это неправильно пихать числа в varchar. Может лучше создать отдельное поле в формате TIMESTAMP и в него писать дату.

Спустя 1 час, 52 минуты, 42 секунды (15.10.2011 - 22:04) imbalance_hero написал(а):
vagon
А кто тебя вообще учил записывать зеркально?
Ты понимаешь, что неважно как ты записываешь, БД хранит её в своём формате, а переводить в правильный вид необходимо при ВЫВОДЕ, а не при записи.
Ты нарушаешь тип данных дату меняя её вид.

Спустя 42 минуты, 6 секунд (15.10.2011 - 22:46) alive написал(а):
killer8080
что-то из текста все равно не хочет преобразовывать.
у меня отдельно поле создается типом TIMSTAMP, а `joindate`это char(). как только не переклел - не хочет.. sad.gif

Спустя 5 минут, 7 секунд (15.10.2011 - 22:51) dadli написал(а):
killer8080
WHERE `joindate` REGEXP '^\d{2}\.\d{2}\.\d{4}$' 

ето зачем нужен, без нё рабоатет харашо, ето наабарот мешает, или мне так кажется ?

Спустя 31 минута, 59 секунд (15.10.2011 - 23:23) alive написал(а):
у меня только последние 2 цифры года кушает, т.е. ставлю
SUBSTRING(`joindate`, 9, 2)
тогда работает, но по умолчанию этот век берет. возможно в форматах чего надо дописать...

Спустя 5 минут, 49 секунд (15.10.2011 - 23:29) killer8080 написал(а):
Цитата (alive @ 15.10.2011 - 22:46)
killer8080
что-то из текста все равно не хочет преобразовывать.
у меня отдельно поле создается типом TIMSTAMP, а `joindate`это char(). как только не переклел - не хочет..

если поле timestamp, то вставлять в него нужно не число (unix_timestamp), а строку вида 2011-10-15 00:00:00
Цитата (dadli @ 15.10.2011 - 22:51)
WHERE `joindate` REGEXP '^\d{2}\.\d{2}\.\d{4}$'

ето зачем нужен, без нё рабоатет харашо, ето наабарот мешает, или мне так кажется ?

потому что преобразовывать нужно только те ряды в которых дата в виде 15.10.2011. Если вдруг по ошибке этот запрос выполнить повторно, то...
Думаю последствия понятны smile.gif

Спустя 11 минут, 52 секунды (15.10.2011 - 23:41) alive написал(а):
Incorrect datetime value: '1921-11-23 00:00:00' for column 'date_new2' at row 1

и так
UPDATE `tb_us` 
SET `date_new2`= CONCAT(
SUBSTRING(
`joindate2`, 7, 4),
'-',
SUBSTRING(`joindate2`, 4, 2),
'-',
SUBSTRING(`joindate2`, 1, 2), ' 00\:00\:00')

и так ругается
UPDATE `tb_us` 
SET `date_new2`= DATE(CONCAT(
SUBSTRING(
`joindate2`, 7, 4),
'-',
SUBSTRING(`joindate2`, 4, 2),
'-',
SUBSTRING(`joindate2`, 1, 2), ' 00\:00\:00')


Цитата
Incorrect datetime value: '1921-11-23' for column 'date_new2' at row 1

Спустя 10 минут, 36 секунд (15.10.2011 - 23:51) dadli написал(а):
killer8080
вот если в таблице есть такие строки:
joindate
----------
14.10.2011
15.10.2011
16.10.2011

и запускаю ваш скрипт:

$res = mysql_query(
"UPDATE `tb_us `
SET `joindate`=UNIX_TIMESTAMP(
CONCAT(
SUBSTRING(`joindate`, 7, 4),
'-',
SUBSTRING(`joindate`, 4, 2),
'-',
SUBSTRING(`joindate`, 1, 2)
)
)
WHERE `joindate` REGEXP '^\d{2}\.\d{2}\.\d{4}$'

"
) or die(mysql_error());


ничего не мeняет, формат не изманяется:

а если запускаю без WHERE `joindate` REGEXP '^\d{2}\.\d{2}\.\d{4}$' уже всо ок, заменят дати так:
1318536000
1318622400
1318708800

тип joindate варчар(20)

почему так происходит не понимаю :unsure:

Спустя 3 часа, 11 минут, 48 секунд (16.10.2011 - 03:03) imbalance_hero написал(а):
Тут надо переделать в нормальный вид дату, вот и всё. Создать отдельное поле даты и данную дату переписать в нормальном виде уже туда, потом удалить первую дату, и создать дубль второй даты с именем первой, то есть просто заменить формат даты. Тысячи проблем по работе с датой пропадут.

Спустя 28 минут, 27 секунд (16.10.2011 - 03:32) Invis1ble написал(а):
update `table`
set `joindate` = timestamp(str_to_date(`joindate`), '%d.%m.%Y')

Спустя 9 часов, 19 минут, 5 секунд (16.10.2011 - 12:51) alive написал(а):
таки не понял как с этим форматом timestamp работать и для чего он. С DATETIME все прекрасно фурычит, а timestamp похду для другого
mysql> SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00');
->
'2004-01-01 00:00:00'

Спустя 10 часов, 46 минут, 1 секунда (16.10.2011 - 23:37) killer8080 написал(а):
Цитата (alive @ 15.10.2011 - 23:41)
Incorrect datetime value: '1921-11-23' for column 'date_new2' at row 1

А что там за даты хранятся? Если там 1927 год, то в поле timestamp его по определению запихнуть нельзя. Тогда только DATE или DATETIME.
Цитата (dadli @ 15.10.2011 - 23:51)
а если запускаю без WHERE `joindate` REGEXP '^\d{2}\.\d{2}\.\d{4}$' уже всо ок, заменят дати так:

Возможно присутствуют пробелы.

Спустя 2 минуты, 47 секунд (16.10.2011 - 23:40) killer8080 написал(а):
Цитата (alive @ 16.10.2011 - 12:51)
таки не понял как с этим форматом timestamp работать и для чего он.

timestamp - это количество секунд от начала эпохи юникс, то есть от 1970-01-01 00:00:00

Спустя 7 минут, 58 секунд (16.10.2011 - 23:48) imbalance_hero написал(а):
killer8080 или alive
Неважен формат, важно его представление.
Если дата записана ТАМ как "1970-01-01 00:00:00", то внутри скрипта ты можешь её представлять как "970-01-01 00:00:00", то есть -1 тысячилетие при выводе информации. Такая своего рода матрица дат.

Такова структура, если используешь timestamp, то тут тогда отрицательные числа для даты ранее.

Спустя 20 минут, 31 секунда (17.10.2011 - 00:08) killer8080 написал(а):
Цитата (imbalance_hero @ 16.10.2011 - 23:48)
Такова структура, если используешь timestamp, то тут тогда отрицательные числа для даты ранее.

В php да, а mysql при таком запросе
SELECT UNIX_TIMESTAMP( '1969-12-31 12:00:00' )

выводит "0" вместо отрицательного числа

Спустя 14 минут, 52 секунды (17.10.2011 - 00:23) imbalance_hero написал(а):
killer8080
Я про время в юниксе: -5000, то есть -5000 секунд от 1970-ого года.
Я не пробовал выборку через '1969', я говорю про хранение в числовом виде.

Спустя 9 минут, 26 секунд (17.10.2011 - 00:32) killer8080 написал(а):
imbalance_hero
это я к тому что
Цитата (killer8080 @ 16.10.2011 - 23:37)
Если там 1927 год, то в поле timestamp его по определению запихнуть нельзя. Тогда только DATE или DATETIME.

На это собственно и указывала ошибка
Цитата
Incorrect datetime value: '1921-11-23' for column 'date_new2' at row 1

Спустя 6 минут, 40 секунд (17.10.2011 - 00:39) imbalance_hero написал(а):
killer8080
Да не, я не тебя исправлял, ты всё правильно говоришь, просто дополнял твой ответ для ТС, чтобы ему было более понятна тема.

Спустя 17 минут, 17 секунд (17.10.2011 - 00:56) Invis1ble написал(а):
Что вы спорите, решение - 2 строчки SQL-кода smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.