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, и получишь нужное число.
Беда бедой. Но можно посчитать с 2090 по 2000, и получишь нужное число.

Спустя 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
Не я, а Котеров и Специалист
Не я, а Котеров и Специалист

Спустя 4 минуты, 37 секунд (27.12.2011 - 16:59) RCuPeR написал(а):
Цитата (inpost @ 27.12.2011 - 13:55) |
RCuPeR Не я, а Котеров и Специалист ![]() |
Не суть.
В общем предыстория:
Есть у меня 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 ?
WHERE `date` BETWEEN d1 AND d2 ?
Спустя 2 минуты, 24 секунды (27.12.2011 - 17:05) RCuPeR написал(а):
Тем, что "1992/02/04" - string.
В БД оно хранится в поле типа VARCHAR.
В БД оно хранится в поле типа VARCHAR.
Спустя 3 минуты, 15 секунд (27.12.2011 - 17:08) Placido написал(а):
Цитата (inpost @ 27.12.2011 - 15:45) |
Но можно посчитать с 2090 по 2000, и получишь нужное число. ![]() |
Только нужно учитывать, что 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) | ||
Только нужно учитывать, что 2000 год - високосный, а 1900 - нет. Поэтому количество дней с 1900.01.01 по 1992.01.10 и с 2000.01.01 по 2092.01.10. будет отличаться на одни сутки. |
Этот вариант не проходит. Это сильно жестокие костыли!
Спустя 15 секунд (27.12.2011 - 17:11) inpost написал(а):
Placido
Это я грубо сказал +1000, а вообще там или +1002, вроде. Надо посчитать, чтобы высокосные совпадали.
Это я грубо сказал +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) | ||
Что мешает перевести в DATETIME? Тут проблема с тем, что изначально был выбран неверный формат хранения данных. |
А можно как-то скопом перевести в DATETIME ?
Спустя 4 минуты, 37 секунд (27.12.2011 - 17:26) RCuPeR написал(а):
Это был глупый вопрос, сам понял
Перевел, в принципе получилось.
Но тут возникла еще одна беда
В некоторых записях у меня хранится не 1992/02/04, а 02/04. Т.е, отсутствует год, и получается, что тип DATE не хочет принимать такой формат данных и переводит значения 02/04 в 0000-00-00. Вот это беда!

Перевел, в принципе получилось.
Но тут возникла еще одна беда

В некоторых записях у меня хранится не 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 написал(а):
Я изначально делал так:
Где:
Т.е, здесь я день каждую дату на "Год", "Месяц" и "День".
В этом цикле я вычисляю все года которые входят в нужный мне диапазон.
Далее думал вычислять месяцы этих годов ($aFormatDbDataBegin[$i][1]) и дни ($aFormatDbDataBegin[$i][2]). Но это невозможно. Так как девятый месяц не входит в диапазон: первый месяц "от" и первый месяц "до"; хотя при этом должны учитываться года.
О Господи... Уверен, никто не поймет здесь ничего :lol:
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) | ||
Глупости, в БД данные нужно хранить как положено, если нужно выводить по другому, форматируй вывод, а не сами данные. |
Перевел все в DATE, там где должно быть /02/10 будет 0000/02/10.
Так, а теперь как составить запрос....
Спустя 4 минуты, 8 секунд (27.12.2011 - 17:49) RCuPeR написал(а):
Так, теперь детальный листинг.
У меня существует вот такая структура БД:
У меня есть дата рождения человека "1992-10-08".
Мне нужно вытащить все записи в диапазон date_begin и date_end которых входит моя дата рождения ?!
У меня существует вот такая структура БД:
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) | ||
SELECT * FROM `name` WHERE `date_begin` >= '1992-10-08' AND `date_end` <= '1992-10-08' |
Спасибо. Так уже сделал

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