код не работает:
<?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 запросом:
Или прочти про это:
Вах, хочешь подскажу функцию одну интересную?
Вот тебе одним 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 написал(а):
А если так?
Кстати, а какой формат поля `joindate`? Хватит ли длины? Да и вообще это неправильно пихать числа в varchar. Может лучше создать отдельное поле в формате TIMESTAMP и в него писать дату.
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(). как только не переклел - не хочет..
что-то из текста все равно не хочет преобразовывать.
у меня отдельно поле создается типом TIMSTAMP, а `joindate`это char(). как только не переклел - не хочет..
Спустя 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. Если вдруг по ошибке этот запрос выполнить повторно, то...
Думаю последствия понятны
Спустя 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
и запускаю ваш скрипт:
ничего не мeняет, формат не изманяется:
а если запускаю без WHERE `joindate` REGEXP '^\d{2}\.\d{2}\.\d{4}$' уже всо ок, заменят дати так:
1318536000
1318622400
1318708800
тип joindate варчар(20)
почему так происходит не понимаю :unsure:
вот если в таблице есть такие строки:
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, то тут тогда отрицательные числа для даты ранее.
Неважен формат, важно его представление.
Если дата записана ТАМ как "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', я говорю про хранение в числовом виде.
Я про время в юниксе: -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-кода