- Расчет возраста от дня рождения — SQL, Oracle и любые другие
- 4 ответа
- Правильный ответ
- Неправильные ответы
- Возможно ответ
- Резюме
- Вычисляем возраст согласно дате в MySQL
- 5 последних уроков рубрики «Разное»
- Как выбрать хороший хостинг для своего сайта?
- Как разместить свой сайт на хостинге? Правильно выбранный хороший хостинг — это будущее Ваших сайтов
- Разработка веб-сайтов с помощью онлайн платформы Wrike
- 20 ресурсов для прототипирования
- Топ 10 бесплатных хостингов
- Вычислить возраст в MySQL (InnoDb)
- 13 ответов:
- Определение возраста по дате рождения в MySQL
- Ссылки
- Русские Блоги
- postgresQL получает возраст по дате рождения
- Интеллектуальная рекомендация
- Жареная монета робота: будда жареная монета
- Подробная интерпретация статьи Mesos и архитектуры системы управления ресурсами и планирования задач
- [База данных] Основы базы данных SQL Server 2012 — Сообщение о параллельном управлении — эксперимент
Расчет возраста от дня рождения — SQL, Oracle и любые другие
Я часто вижу людей, которые предполагают, что DATEDIFF(YEAR, date_of_birth, GETDATE()) определят текущий возраст человека.
К сожалению это не правильно. Функция DATEDIFF , по крайней мере, в SQL Server, не считает количество полных лет между двумя датами — она считает количество пересеченных календарных границ.
То есть в случае параметра YEAR DATEDIFF подсчитывает количество пересеченных 1-января. С параметром MONTH он будет считать число 1-го числа прошедшего месяца.
Так, например, ребенку, родившемуся 31 декабря 17 года, уже будет «1 год», когда на самом деле ему не исполнится 1 год до 31 декабря 18 года, и в настоящее время ему 0 лет.
Использование функции DATEDIFF таким образом эквивалентно написанию YEAR(GETDATE()) — YEAR(date_of_birth) , которое, конечно, не учитывает, где день рождения человека выпадает на год.
Рассмотрев здесь хороший пример других вопросов, кажется, что нет однозначного ответа, и есть много ответов, которые совершенно неверны.
Итак, мой вопрос . Каково самое простое выражение, которое, учитывая дату рождения человека и контрольную дату, рассчитывает возраст человека на эту контрольную дату?
Я ищу ответ в следующих терминах:
Ответ должен быть встроенным выражением, которое можно выбрать или включить в предложение where.
Ответ должен быть надежным и не содержать ошибочных угловых случаев — какими бы редкими или неправдоподобными они ни были. Он должен работать для новорожденных и для людей, которым исполнилось бы столетия, он должен справляться с високосными годами, и в идеале в идеале должен представлять период до рождения как минус число (при этом человек становится — 1 год на день до их рождения).
Ответ должен быть численно точным — он не должен полагаться на использование среднего числа дней в году или деление на магические числа и округление ошибки. Я считаю, что все тривиальные подходы, которые используют округление, имеют угловые случаи и, следовательно, не являются надежными, но я должен быть исправлен.
Для тех, чьи дни рождения приходятся на 29 февраля, они должны рассматривать свой возраст как возрастающий 29 февраля, если базовым годом является високосный год, или должны относиться к их возрасту с 1 марта, если базовым годом не является високосный год.
Ответ должен игнорировать любой временной компонент даты рождения или контрольной даты, то есть предполагается, что человек родился в полночь, а его возраст должен увеличиваться в полночь в последующие дни рождения.
Мне особенно интересен ответ для SQL Server, но также было бы интересно увидеть ответы для любой другой платформы баз данных .
РЕДАКТИРОВАТЬ . Я благодарен за предоставленные ответы и ссылки на предыдущие вопросы. Этот вопрос теперь помечен как дубликат.
Что меня поражает, так это то, что принятый ответ на данную ссылку загроможден и начинается с неправильной реализации, а комментарии к ней относятся к неверной ее реализации — только после того, как я внимательно ее прочитал, я увидел, что она была обновлена с помощью правильная реализация (зажатая между обработкой «десятичного возраста», которая не связана с моим вопросом). Третий ответ, который также привлек значительное количество голосов, также неверен. Есть также множество других ответов разного качества.
Я также попросил дать ответ, который в идеале правильно обрабатывает «отрицательный возраст» каким-либо образом (где контрольная дата находится до даты рождения), а связанные ответы — нет. Поэтому, хотя мой вопрос касается одной и той же темы, он не является дубликатом, поскольку я наложил несколько дополнительных ограничений, которых нет в этом вопросе и которые аннулируют (так или иначе) все ответы, данные на этот более старый вопрос. вопрос.
Честно говоря, учитывая, сколько тонко неправильных ответов предостаточно (как я упоминал выше в моем первом абзаце), я бы подумал, что этот вопрос получит больше голосов и больше интереса, чем число голосов и 3, чтобы закрыть.
4 ответа
Правильный ответ
Собранный из приведенных источников, это правильный ответ для SQL Server (с 2012 года) :
Это преобразует дату в строку даты ISO (ГГГГММДД), преобразует строку в и int, а затем вычитает одно из другого — если месяц и месяц рождения больше контрольной даты, это вычитание заимствует цифру из года составная часть. Затем мы делим целое число на 10000, чтобы получить разницу в целых годах. Это без проблем работает в високосные годы. Части времени автоматически усекаются при конвертации. CHAR(8) используется как строка фиксированной длины.
Для других платформ я бы рекомендовал адаптировать это решение SQL Server. Для SQL Server до 2012 года замените IIF на CASE .
Есть, конечно, множество других правильных способов, но это, кажется, встроенное решение, наиболее экономичное с синтаксисом, и я не видел ничего лучшего.
Неправильные ответы
Я просто подумал, что потрачу минуту на то, чтобы найти неправильные ответы в разных источниках, на пользу будущим читателям.
Как уже упоминалось в моем вопросе, это первый подход, который многие пытаются использовать. К сожалению, он учитывает только разницу в летней части даты, поэтому ребенку, родившемуся 31 декабря 17 года, исполняется 1 год 1 января 18 года. Это хорошо, но не правильно.
Похоже, это еще один общий подход, который также был приведен в комментарии к моему вопросу.
Для ребенка, рожденного 28 февраля 17 года, по правильному подсчету, ему исполняется 1 год 28 февраля 18 года — на следующий день рождения. Между двумя датами проходит 365 дней. 365 / 365,25 = 0,99. Этаж становится ноль. С 1 марта по 18 марта к ребенку исполняется 1 год — слишком поздно.
Дальнейшее уточнение делителя «число дней в году» после десятичной запятой не помогает, так как любой делитель выше 365 точно, в этом случае потерпит неудачу. Это хорошо, но не правильно.
Разновидностью (2) является использование часов вместо дней. В каждом дне есть фиксированное количество часов, поэтому 8766/24 = 365,25. Мы видим, что это решение эквивалентно (2). Это хорошо, но не правильно.
Другой вариант заключается в использовании округления по часам. Это имеет тот же дефект, что и (3), по тем же причинам, но дополнительно, если задействован компонент времени, он округляет вверх за последние 30 минут дня до ко дню рождения. Это хорошо, но не правильно.
Другие исследовали, может ли DAYOFYEAR предоставить решение. К сожалению, из-за високосных лет стандарт DAYOFYEAR не сопоставляется согласованно с конкретными датами (месяцами и месяцами) года. Это хорошо, но не правильно.
Возможно ответ
Это специфичное для Oracle решение перестает работать, когда дата рождения — 29 февраля (в високосный год), а контрольная дата — 28 февраля (в не високосный год), поскольку он рассматривает день рождения как 28 февраля в не високосные годы.
Это на самом деле может быть ближе к общему соглашению о том, когда день рождения отмечается для детей високосного года, но я указал в своем вопросе, что в таких случаях день рождения для целей расчета возраста человека следует рассматривать как 1 марта (что соответствует законодательству Великобритании).
MONTHS_BETWEEN также имеет другие причуды, которые могут быть нежелательны для расчета возраста (например, если он используется для расчета возраста в виде количества месяцев, например, для детей младше 1 года, когда выпадает «день рождения») в один и тот же день месяца или в последующие месяцы).
Это хорошо, , и в некоторых случаях это можно считать правильным!
Резюме
Конечно, есть и другие способы реализации правильного решения, чем тот, который приведен здесь, но следует принять во внимание список неправильных ответов (и много других необоснованных примеров, которые я здесь не рассматриваю), и любые инновации или альтернативные вычисления должны быть тщательно протестирован и сравнен с тем, который уже работает.
В Oracle вы можете сделать это так,
Если день рождения 29 февраля и 1 марта считается днем рождения, если год не високосный, вы можете использовать запрос ниже,
Источник
Вычисляем возраст согласно дате в MySQL
Если перед вами встанет задача вычисления возраста пользователя по дате его рождения непосредственно в MySQL, то в данной статье вы найдёте готовое решение.
В недрах сети было найдено решение. Мы его немного подлатали, убрали избыточные конвертации и обернули в функцию, которую можно использовать в дальнейшем.
На первый взгляд немного мудрёное решение, однако если его опробовать, то результат будет чёткий и точный. Принцип таков: вычитаем текущий год из года рождения пользователя; если текущий день и месяц меньше даты рождения пользователя отнимаем ещё год.
Использовать данную функцию можно следующим образом.
Вот и всё! Данные типа DATE превращаются в возраст.
Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: http://codingexplained.com/databases/mysql/calculate-age-from-date-of-birth-in-mysql
Перевел: Станислав Протасевич
Урок создан: 30 Апреля 2015
Просмотров: 8352
Правила перепечатки
5 последних уроков рубрики «Разное»
Как выбрать хороший хостинг для своего сайта?
Выбрать хороший хостинг для своего сайта достаточно сложная задача. Особенно сейчас, когда на рынке услуг хостинга действует несколько сотен игроков с очень привлекательными предложениями. Хорошим вариантом является лидер рейтинга Хостинг Ниндзя — Макхост.
Как разместить свой сайт на хостинге? Правильно выбранный хороший хостинг — это будущее Ваших сайтов
Проект готов, Все проверено на локальном сервере OpenServer и можно переносить сайт на хостинг. Вот только какую компанию выбрать? Предлагаю рассмотреть хостинг fornex.com. Отличное место для твоего проекта с перспективами бурного роста.
Разработка веб-сайтов с помощью онлайн платформы Wrike
Создание вебсайта — процесс трудоёмкий, требующий слаженного взаимодействия между заказчиком и исполнителем, а также между всеми членами коллектива, вовлечёнными в проект. И в этом очень хорошее подспорье окажет онлайн платформа Wrike.
20 ресурсов для прототипирования
Подборка из нескольких десятков ресурсов для создания мокапов и прототипов.
Топ 10 бесплатных хостингов
Небольшая подборка провайдеров бесплатного хостинга с подробным описанием.
Источник
Вычислить возраст в MySQL (InnoDb)
Если у меня есть лица дата рождения хранится в таблице в виде dd-mm-yyyy и я вычитаю его из текущей даты, в каком формате возвращается дата?
Как я могу использовать этот возвращенный формат для вычисления чьего-то возраста?
13 ответов:
Если значение хранится в виде типа данных DATETIME:
менее точно, когда вы рассматриваете високосные годы:
таким образом, вы рассматриваете даже месяц и день рождения, чтобы иметь более точный расчет возраста.
простой, но элегантный..
он возвращает этот год-Год рождения (сколько лет человеку будет в этом году после дня рождения) и настраивается на основе того, был ли у человека день рождения еще в этом году.
Он не страдает от ошибок округления других представленных здесь методов.
свободно адаптировано из здесь
Это как вычислить возраст в MySQL:
вы можете сделать функцию, чтобы сделать это:
Теперь вы можете получить возраст от дата:
Если ваша дата находится в формате Y-m-d H:i:s, Вы можете сделать это:
вы можете использовать эту функцию в любом месте 😉
Я предпочитаю использовать функцию таким образом.
Так как вопрос помечается для mysql , У меня есть следующая реализация, которая работает для меня, и я надеюсь, что подобные альтернативы будут там для других СУБД. вот sql:
дата рождения-это имя поля, которое сохраняет имя даты рождения возьмите творог () поверните к команде год за годом () минус с годом() от поля даты рождения
есть два простых способа сделать это:
Источник
Определение возраста по дате рождения в MySQL
Определить возраст любого из пользователей в базе данных MySQL ее же средствами можно достаточно просто , если вычислить разницу между текущим годом и годом его рождения, а из результата вычесть единицу, если текущий день находится к началу календаря ближе, нежели день рождения юзера.
Приведенный ниже запрос выводит имя, дату рождения каждого пользователя и его возраст.
В этом запросе функция YEAR() выделяет из даты год, а RIGHT() — пять крайних справа символов, представляющих календарный день ( MM-DD ). Часть выражения, сравнивающая даты, выдает 1 или 0, что позволяет уменьшить результат на единицу, если текущий день ( CURRENT_DATE ) находится к началу календаря ближе, нежели день рождения пользователя.
Все выражение смотрится несколько неуклюже, поэтому вместо него в заголовке соответствующего столбца результатов выводится псевдоним ( age — «возраст»).
Изначально таблица users в MySQL имеет такой вид:
id | name | birth |
---|---|---|
1 | Кобзарев Михаил Николаевич | 1986-01-04 |
2 | Иванов Иван Иванович | 1955-12-12 |
… | ||
n | Пупкин Василий Петрович | 1856-03-29 |
Ссылки
Суровый русский тимлид. Жил в Магадане, в офисе московских веб студий и в Тульской деревне. Виртуозно знает WordPress, PHP, ООП, Vue.js и вот это вот все.
Делает крутые высоконагруженные сайты, поэтому уже почти захватил весь рынок WordPress разработки в России. Не дает никому делать сайты без спроса.
Ведет блог о разработке, дайджест в телеграмме и в ВК.
Источник
Русские Блоги
postgresQL получает возраст по дате рождения
Три основные функции представления времени CURRENT_DATE / CURRENT_TIME / NOW ()
Вернуть текущую дату в формате год-месяц-день (гггг-ММ-дд):
2019-01-10
Возвращает время дня в виде час: минута: секунда + часовой пояс (ЧЧ: мм: сс):
17:49:11.585308+08
Возвращает текущее время в виде год-месяц-день час: минута: секунда (гггг-мм-дд ЧЧ: мм: сс):
2019-01-10 17:50:45.354983+0
Затем несколько расчетных формул
Первый — это прямое управление датой.
Результат 26 26 Результаты двух форматов времени совпадают.
Выход
26 years 9 days
26 years 8 days 08:00:00
Функция age () выведет точную строку возраста. В зависимости от прошедшего времени формат времени вывода соответствует
Если вы используете функцию now () для вычисления, вам нужно обратить внимание, что функция age () может выводить правильный результат, а единица прямого вычисления — день.
Выводить отдельно
26 years 9 days 19:20:46.395713
26 years 9 days 03:20:46.421816
26 days 01:02:21.497111
26 days 00:59:43.688958
Интеллектуальная рекомендация
Жареная монета робота: будда жареная монета
Генеральный директор Hammer Technology Luo Yonghao сегодня сказал в Weibo. «Накануне революции платформы, вы не волнуетесь, застраховатеть весь день, я не заработал, сколько денег, и у меня не б.
Подробная интерпретация статьи Mesos и архитектуры системы управления ресурсами и планирования задач
0. Предисловие Для получения справочной информации, истории разработки и некоторых базовых знаний о системе управления ресурсами и планирования задач, пожалуйста, обратитесь к блогу.Сводка по системе .
[База данных] Основы базы данных SQL Server 2012 — Сообщение о параллельном управлении — эксперимент
Это экспериментальный отчет о первом семестре «База данных базы данных», в общей сложности 15 экспериментов, в топ-12 библиотеке Baidu, после трех онлайн, я не могу найти его, я провел мно.
Источник