Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разница между двумя датами в днях 
:(
    Опции темы
Dmitry_177
Дата 14.1.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



из БД MySQL берется дата $select_arr['enddate'], хранится она там как DATE
и есть сегодняшняя дата date("Y-m-d H:i:s")

нужно посчитать между ними разницу в днях.. помогите как это сделать..
PM MAIL   Вверх
NNaarreekk
Дата 14.1.2008, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



Используй strtotime
PM MAIL WWW   Вверх
MoLeX
Дата 14.1.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



Цитата

Замечание: Для большинства систем допустимыми являются даты с 13 декабря 1901, 20:45:54 GMT по 19 января 2038, 03:14:07 GMT. (Эти даты соответствуют минимальному и максимальному значению 32-битового целого со знаком). Для Windows допустимы даты с 01-01-1970 по 19-01-2038. Не все платформы поддерживают отрицательные метки времени, поэтому даты ранее 1 января 1970 г. не поддерживаются в Windows, некоторых версиях Linux и некоторых других операционных системах. 


 smile 


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Sunvas
Дата 14.1.2008, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 8
Всего: 89



Разницу в днях между двумя датами в формате UNIX timestamp можно сверить, используя такую конструкцию:
Код

bcdiv($date1 - $date2, 86400);


Чтобы получить сегодняшнюю дату в UNIX timestamp - можно использовать функцию time();
Чтобы получить UNIX timestamp, можно пойти двумя способами: 1) взвалить это задание на MySQL 2) используя хитрости ПХП. Я бы посоветовал первый вариант т.к. он проще. Для этого:

Код

SELECT ..., UNIX_TIMESTAMP(date), ... FROM ...




--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
GeneralElectric
Дата 14.1.2008, 19:35 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



Надеюсь никто не расценит это как оскорбление, но если речь идет о датах, получаемых из БД mysql, то вычислять разницу между ними в PHP будет величайшей глупостью. Насколько бедны средства PHP для работы с датами - настолько они богаты в mysql. там есть всё. В том числе и функции для вычисления количества дней. 
to_days() в запросе решит все проблемы.
PM MAIL   Вверх
Sunvas
Дата 14.1.2008, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 8
Всего: 89



Ну, можно и из-под мускула делать. Тема все-таки была задана не в разделе БД. А по сабжу, автору в помощь:
http://doc.dubs.odessa.net/MySQL/Date_and_..._functions.html


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Golda
Дата 14.1.2008, 22:54 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 26.3.2007
Где: Ариель, Израиль

Репутация: 20
Всего: 42



Совершенно согласна с GeneralElectric. А еще добавлю, что если PHP и MySQL бегут на разных серверах, время может отличаться. Лучше сравнивать время, отсчитываемое в одной системе. правда, справедливости ради нужно заметить, что при расчетах разницы с точностью до дня это редко будет заметно.


--------------------
"For every problem, there exists a simple and elegant solution which is absolutely wrong." -- J. Wagoner, U.C.B. Mathematics
PM MAIL   Вверх
Dmitry_177
Дата 15.1.2008, 04:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



ок, сделаю я такой запрос.. а как мне узнать результат в PHP? при выборе полей из таблицы там массив, все понятно.. А тут? непонятно..
PM MAIL   Вверх
GeneralElectric
Дата 15.1.2008, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



Во-первых, массив бывает всегда. Все, что возвращает база данных, ты получаешь в виде массива. Функци mysql_fetch_* ничего другого возвращать не умеют. И для базы данных одинаково, запрашиваешь ли ты поля таблицы или просто результат выражения. К примеру, все примеры функций в мануале показывают именно второе. К примеру, SELECT 1+1;
после выполнения этого запроса база вернет тебе массив с одним элементом, в котором будет число 2. Никакой разницы с запросом SELECT two FROM numbers;

Во-вторых, сдается мне, что ты собрался делать отдельный запрос на вычисление. Это даже хуже, чем считать в пхп. Ну ладно, если одну дату надо. А если 20? Вся суть в том-то и состоит, что вычислять прямо в том же запросе, который получает данные!
просто пишешь 
SELECT *, TO_DAYS(NOW()) - TO_DAYS(`enddate`) FROM...
чтобы удобно обращаться к нему, сделай в запросе алиас,
SELECT *, TO_DAYS(NOW()) - TO_DAYS(`enddate`) as days FROM...

Вообще, хотя учить синтаксис SQL задавая вопросы на форуме - это очень легкий и приятный способ, но лучше бы, всё же, немножко начинат ьего осваивать самостоятельно, по учебникам.


PM MAIL   Вверх
flashaa
Дата 15.1.2008, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Цитата(GeneralElectric @  14.1.2008,  19:35 Найти цитируемый пост)
Насколько бедны средства PHP для работы с датами - настолько они богаты в mysql

Возможности у них вообщем-то одинаковые, но в PHP чуть длинее получится код, т.к. готовых решений типа to_days меньше. В данном случае конечно надо считать в Mysql - с этим согласен. 

Это сообщение отредактировал(а) flashaa - 15.1.2008, 13:44
PM MAIL   Вверх
GeneralElectric
Дата 15.1.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



"типа to_days", как раз, есть - GregorianToJD()
Но дело не в том, что в PHP готовых решений меньше. В PHP вообще отсутствует такой тип данных, как дата. А в MySQL - присутствует. Это принципиальное различие, которое влечет за собой проблемы разной степени тяжести. 
PM MAIL   Вверх
flashaa
Дата 15.1.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Например какие проблемы в PHP? Я пока не видел ни одной, кроме необходимости писать больше кода.
С компонентами даты мы можем работать. 
Получить дату(timestamp) из строки можем, при чем на тех же началах, что и в mysql.

Это сообщение отредактировал(а) flashaa - 15.1.2008, 15:18
PM MAIL   Вверх
GeneralElectric
Дата 15.1.2008, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



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

PM MAIL   Вверх
flashaa
Дата 15.1.2008, 15:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



НУ почему бессмысленной? Мне действительно интересно какие проблемы с датами конкретно в пхп. 
Ф-ции то пхп-шные поддерживают работу с компонентами, зачем нам тип, если неявно функциями все будет предусмотрено?
Причем и переходы на летнее время и высокосные года и все ньюансы, свойственные именно датам.
вот вам аналог интервала:

Код

$date1 = time(); // текущее время
$date2 = strtotime('+ 1 day', $date1); // DATE_ADD(NOW(), INTERVAL 1 DAY);


Вот сумирование с другой меткой (корректное суммирование)

Код

$date1 = ...// некоторая метка, означающая интервал времени
$date3 = strtotime('+ ' . gmdate('U', $date1) . ' second', $date2);


Вот разница между датами $date1 и $date2:
Код

$diff = strtotime('-' . date('U', $date2) . 'second', $date1);


Просто в пхп все без ВСТРОЕННЫХ готовых решений, вот и все. Ничем не больше он ограничен, чем mysql.

Это сообщение отредактировал(а) flashaa - 15.1.2008, 16:09
PM MAIL   Вверх
flashaa
Дата 15.1.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Ответьте все-таки, GeneralElectric. 
Или получится что полемика, описанная вами, шла именно с вашей стороны, т.к. я то свое мнение аргументирую =)
PM MAIL   Вверх
SelenIT
Дата 15.1.2008, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 32
Всего: 401



flashaa, ничего, если я подключусь?
Цитата(flashaa @  15.1.2008,  15:59 Найти цитируемый пост)
и все ньюансы, свойственные именно датам

1 апреля 1899 года - дата? А 28 февраля 2038? Интересно увидеть вычисление разницы между ними ;). Особенно в свете утверждения
Цитата(flashaa @  15.1.2008,  15:59 Найти цитируемый пост)
Ничем не больше он ограничен, чем mysql

Хотя финт с strtotime красив, не спорю smile.


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Dmitry_177
Дата 16.1.2008, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



а может так лучше сделать?

Код

$select_q = mysql_query(...);
$select_row = mysql_fetch_row($select_q);
echo $select_row[0];

PM MAIL   Вверх
GeneralElectric
Дата 16.1.2008, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



Лучше чем что?

PM MAIL   Вверх
Dmitry_177
Дата 16.1.2008, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 22.9.2006

Репутация: нет
Всего: нет



чем в запросе применить: as days
Код

SELECT *, TO_DAYS(NOW()) - TO_DAYS(`enddate`) as days FROM...

PM MAIL   Вверх
GeneralElectric
Дата 16.1.2008, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



Мда. Печально.
PM MAIL   Вверх
flashaa
Дата 16.1.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



Цитата(SelenIT @  15.1.2008,  21:56 Найти цитируемый пост)
1 апреля 1899 года - дата? А 28 февраля 2038?

вот тут в точку.
PM MAIL   Вверх
FractalizeR
Дата 19.1.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 27.12.2007
Где: Россия/Москва

Репутация: 2
Всего: 4



В MySQL есть еще очень удобная TIMESTAMPDIFF для получения разницы между двумя датами.


--------------------
Чтобы поблагодарить или наоборот поругать участника форума лучше пользоваться значками "+" и "-", изменяющими репутацию. Они находятся слева от поста под именем пользователя.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1304 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.