[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Узнать сколько прошло времени от...
RCuPeR
Есть вот такая функция:
        function getDayFromYear($year, $month, $day){
$sec = strtotime(''. $year .'-'. $month .'-'. $day .'') - strtotime('1990-01-01');
return round( ( $sec / ( 60 * 60 * 24 ) ) + 1 );
}

echo getDayFromYear('1992', '01', '10');



Она высчитывает сколько прошло дней с 1990.01.01 по 1992.01.10.
Результат возвращает верный: 740.
Но, тут возникла загвоздка: мне нужно установить время отсчета не 1990.01.01, а 1900.01.01.
Это возможно ?

У меня не получается, возвращает 8048, хотя 33580 (примерно).



Спустя 2 минуты, 58 секунд (27.12.2011 - 16:45) inpost написал(а):
Нет, точка отсчёта - 1970 год.
Беда бедой. Но можно посчитать с 2090 по 2000, и получишь нужное число. smile.gif

Спустя 7 минут, 14 секунд (27.12.2011 - 16:52) RCuPeR написал(а):
Цитата
Нет, точка отсчёта - 1970 год.

И я так думал. Но возьми эту функцию и вместо "1990-01-01" добавь "1910-01-01" или "1920-01-01". В теории будет одно значение от "1970-01-01", но... Практика показывает иное.

Цитата
Беда бедой. Но можно посчитать с 2090 по 2000, и получишь нужное число.

Т.е, ты предлагаешь к обеим моим годам добавить + 1000 ? Хм...

Спустя 2 минуты, 27 секунд (27.12.2011 - 16:55) inpost написал(а):
RCuPeR
Не я, а Котеров и Специалист smile.gif

Спустя 4 минуты, 37 секунд (27.12.2011 - 16:59) RCuPeR написал(а):
Цитата (inpost @ 27.12.2011 - 13:55)
RCuPeR
Не я, а Котеров и Специалист smile.gif

Не суть.

В общем предыстория:
Есть у меня 3 даты.
Дата начало чего-то: 1992/02/04.
Дата конца чего-то: 1993/01/22.
И дата рождения кого-то: 1992/08/10.

Мне нужно узнать, входит ли дата рождения кого-то в диапазон дат "От" и "До".
Думал, решить эту проблему подсчетом дней от 1900-01-01.

Может есть иные методы решения данной задачи ?

Спустя 3 минуты, 31 секунда (27.12.2011 - 17:03) inpost написал(а):
А чем тебе не подходит запрос к БД с сравнением:
WHERE `date` BETWEEN d1 AND d2 ?

Спустя 2 минуты, 24 секунды (27.12.2011 - 17:05) RCuPeR написал(а):
Тем, что "1992/02/04" - string.
В БД оно хранится в поле типа VARCHAR.

Спустя 3 минуты, 15 секунд (27.12.2011 - 17:08) Placido написал(а):
Цитата (inpost @ 27.12.2011 - 15:45)
Но можно посчитать с 2090 по 2000, и получишь нужное число. smile.gif

Только нужно учитывать, что 2000 год - високосный, а 1900 - нет. Поэтому количество дней с 1900.01.01 по 1992.01.10 и с 2000.01.01 по 2092.01.10. будет отличаться на одни сутки.

Спустя 1 минута, 58 секунд (27.12.2011 - 17:10) RCuPeR написал(а):
Цитата (Placido @ 27.12.2011 - 14:08)
Цитата (inpost @ 27.12.2011 - 15:45)
Но можно посчитать с 2090 по 2000, и получишь нужное число. smile.gif

Только нужно учитывать, что 2000 год - високосный, а 1900 - нет. Поэтому количество дней с 1900.01.01 по 1992.01.10 и с 2000.01.01 по 2092.01.10. будет отличаться на одни сутки.

Этот вариант не проходит. Это сильно жестокие костыли!

Спустя 15 секунд (27.12.2011 - 17:11) inpost написал(а):
Placido
Это я грубо сказал +1000, а вообще там или +1002, вроде. Надо посчитать, чтобы высокосные совпадали.

Спустя 4 минуты, 40 секунд (27.12.2011 - 17:15) RCuPeR написал(а):
Не ребят, этот вариант оставим на самый конец если ничего не возможно будет придумать.
У кого еще какие мысли по поводу изменения алгоритма ?

Спустя 1 минута, 21 секунда (27.12.2011 - 17:17) killer8080 написал(а):
Цитата (RCuPeR @ 27.12.2011 - 16:05)
Тем, что "1992/02/04" - string.
В БД оно хранится в поле типа VARCHAR.

Что мешает перевести в DATETIME? Тут проблема с тем, что изначально был выбран неверный формат хранения данных.

Спустя 4 минуты, 37 секунд (27.12.2011 - 17:21) RCuPeR написал(а):
Цитата (killer8080 @ 27.12.2011 - 14:17)
Цитата (RCuPeR @ 27.12.2011 - 16:05)
Тем, что "1992/02/04" - string.
В БД оно хранится в поле типа VARCHAR.

Что мешает перевести в DATETIME? Тут проблема с тем, что изначально был выбран неверный формат хранения данных.

А можно как-то скопом перевести в DATETIME ?

Спустя 4 минуты, 37 секунд (27.12.2011 - 17:26) RCuPeR написал(а):
Это был глупый вопрос, сам понял biggrin.gif

Перевел, в принципе получилось.
Но тут возникла еще одна беда rolleyes.gif
В некоторых записях у меня хранится не 1992/02/04, а 02/04. Т.е, отсутствует год, и получается, что тип DATE не хочет принимать такой формат данных и переводит значения 02/04 в 0000-00-00. Вот это беда!

Спустя 4 минуты, 6 секунд (27.12.2011 - 17:30) killer8080 написал(а):
Цитата (RCuPeR @ 27.12.2011 - 16:26)
В некоторых записях у меня хранится не 1992/02/04, а 02/04. Т.е, отсутствует год, и получается, что тип DATE не хочет принимать такой формат данных и переводит значения 02/04 в 0000-00-00. Вот это беда!

исправь в ручную, или их слишком много?

Спустя 1 минута, 59 секунд (27.12.2011 - 17:32) RCuPeR написал(а):
Дело в том, что должно быть именно 02/04.
Да...Дела...

Спустя 2 минуты, 13 секунд (27.12.2011 - 17:34) killer8080 написал(а):
Цитата (RCuPeR @ 27.12.2011 - 16:32)
Дело в том, что должно быть именно 02/04.
Да...Дела...

Глупости, в БД данные нужно хранить как положено, если нужно выводить по другому, форматируй вывод, а не сами данные.

Спустя 5 минут, 6 секунд (27.12.2011 - 17:39) RCuPeR написал(а):
Я изначально делал так:
for($i = 0; $i <= count($aFormatDbDataBegin); $i++){
if(($aFormatBirthday['year'] >= $aFormatDbDataBegin[$i][0]) && ($aFormatBirthday['year'] <= $aFormatDbDataEnd[$i][0]))
$test .= 'true';
}


Где:


$aFormatBirthday['year'] // Год роджения
$aFormatDbDataBegin[$i][0] // Год "от"
$aFormatDbDataEnd[$i][0] // Год "после"



Т.е, здесь я день каждую дату на "Год", "Месяц" и "День".
В этом цикле я вычисляю все года которые входят в нужный мне диапазон.
Далее думал вычислять месяцы этих годов ($aFormatDbDataBegin[$i][1]) и дни ($aFormatDbDataBegin[$i][2]). Но это невозможно. Так как девятый месяц не входит в диапазон: первый месяц "от" и первый месяц "до"; хотя при этом должны учитываться года.

О Господи... Уверен, никто не поймет здесь ничего :lol:

Спустя 5 минут, 39 секунд (27.12.2011 - 17:45) RCuPeR написал(а):
Цитата (killer8080 @ 27.12.2011 - 14:34)
Цитата (RCuPeR @ 27.12.2011 - 16:32)
Дело в том, что должно быть именно 02/04.
Да...Дела...

Глупости, в БД данные нужно хранить как положено, если нужно выводить по другому, форматируй вывод, а не сами данные.

Перевел все в DATE, там где должно быть /02/10 будет 0000/02/10.

Так, а теперь как составить запрос....

Спустя 4 минуты, 8 секунд (27.12.2011 - 17:49) RCuPeR написал(а):
Так, теперь детальный листинг.

У меня существует вот такая структура БД:

CREATE TABLE IF NOT EXISTS `name` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`type` int(2) NOT NULL,
`zodiac` int(2) DEFAULT NULL,
`date_begin` date DEFAULT NULL,
`date_end` date DEFAULT NULL,
`name` varchar(200) NOT NULL,
`other` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=131 ;

INSERT INTO `phpfox_exotichoroscopes_data` (`id`, `type`, `zodiac`, `date_begin`, `date_end`, `name`, `other`) VALUES
(1, 1, NULL, '1900-01-31', '1901-02-18', 'Крыса', ''),
(
2, 1, NULL, '1912-02-18', '1913-02-05', 'Крыса', ''),
(
3, 1, NULL, '1924-02-05', '1925-01-23', 'Крыса', ''),
(
4, 1, NULL, '1991-02-15', '1992-02-03', 'Коза', ''),
(
5, 1, NULL, '1992-02-04', '1993-01-22', 'Обезьяна', ''),
(
6, 2, NULL, '1991-02-15', '1992-02-03', 'Овца', ''),
(
7, 2, NULL, '1992-02-04', '1993-01-22', 'Обезьяна', ''),
(
10, 3, NULL, '0000-08-20', '0000-08-31', 'Геб', ''),
(
11, 3, NULL, '0000-08-12', '0000-08-19', 'Гор', ''),
(
12, 3, NULL, '0000-08-01', '0000-08-11', 'Сехмет', ''), ........


У меня есть дата рождения человека "1992-10-08".
Мне нужно вытащить все записи в диапазон date_begin и date_end которых входит моя дата рождения ?!

Спустя 1 час, 4 минуты, 11 секунд (27.12.2011 - 18:53) killer8080 написал(а):
Цитата (RCuPeR @ 27.12.2011 - 16:49)
У меня есть дата рождения человека "1992-10-08".
Мне нужно вытащить все записи в диапазон date_begin и date_end которых входит моя дата рождения ?!

SELECT * FROM `name` WHERE `date_begin` >= '1992-10-08' AND `date_end` <= '1992-10-08'

Спустя 1 час, 57 минут, 54 секунды (27.12.2011 - 20:51) RCuPeR написал(а):
Цитата (killer8080 @ 27.12.2011 - 15:53)
Цитата (RCuPeR @ 27.12.2011 - 16:49)
У меня есть дата рождения человека "1992-10-08".
Мне нужно вытащить все записи в диапазон date_begin и date_end которых входит моя дата рождения ?!

SELECT * FROM `name` WHERE `date_begin` >= '1992-10-08' AND `date_end` <= '1992-10-08'

Спасибо. Так уже сделал wink.gif
Плюсую в карму.

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


_____________
Гнусный социопат с комплексом Бога.
Быстрый ответ:

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