powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как вычислить возраст исходя из двух дат в полях БД sqlite?
10 сообщений из 10, страница 1 из 1
Как вычислить возраст исходя из двух дат в полях БД sqlite?
    #38407626
tororo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Два поля:
dr date
'1937-12-02' '2013-12-01'

Можно ли как-нибудь средствами самой СУБД вычислить возраст человека по отношению к дате date?
Вычесть из второй даты дату рождения - не вариант! Он покажет 76 лет, а человеку на момент наступления date 75 лет, 76 исполнится только на следующий день.

Тут бы надо писать какую-нибудь функцию, но sqlite не поддерживает никаких собственных встроенных функций (UDF). И как тут выкрутиться?
...
Рейтинг: 0 / 0
Как вычислить возраст исходя из двух дат в полях БД sqlite?
    #38407637
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Даты надо правильно вычислять, тогда и проблем не будет

2) http://sqlite.org/c3ref/create_function.html
...
Рейтинг: 0 / 0
Как вычислить возраст исходя из двух дат в полях БД sqlite?
    #38407647
tororo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

1. Что значит "правильно вычислять"? А у меня приведены какие-то неправильные даты?
2. Я не умею Си.
...
Рейтинг: 0 / 0
Как вычислить возраст исходя из двух дат в полях БД sqlite?
    #38407652
tororo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2. И, насколько я могу понять, это будет не встроенная прямо в файл БД функция, а нечто хранящееся извне.
К примеру, я видел пример, как делать подобную пользовательскую функцию на питоне. Но мне-то надо, что представление (view), хранимое в самой БД, умело вычислять возраст исходя из двух дат. А потом, в питоне, уже просто получить результат запроса с уже вычисленными возрастами. Или не в питоне, в любом другом языке, но получить то же самое.
...
Рейтинг: 0 / 0
Как вычислить возраст исходя из двух дат в полях БД sqlite?
    #38407986
tororo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select date - dr + (case when strftime('%m-%d', date) < strftime('%m-%d', dr) then -1 else 0 end) as age from mytable

1. Вычитается из даты date дата dr. Получаем разницу в годах между годом даты date и годом даты dr
2. Проверяем, если месяц и день даты date меньше месяца и дня dr, то вычитаем один год из предыдущего полученного значения, ибо человеку ещё не исполнилось столько годков.
...
Рейтинг: 0 / 0
Как вычислить возраст исходя из двух дат в полях БД sqlite?
    #38408893
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tororoselect date - dr + (case when strftime('%m-%d', date) < strftime('%m-%d', dr) then -1 else 0 end) as age from mytable

1. Вычитается из даты date дата dr. Получаем разницу в годах между годом даты date и годом даты drА ты знаешь что в SQLite нету типа данных "дата"?
select date - dr работает как "взять текст date, перевести его в число. Так же перевести в число текст из поля dr. Вычесть одно число из другого". Перевод текста в число идет успешно до первого не-цифрового символа.
То есть запись select date - dr превращается в 2013-1937.

tororo2. Проверяем, если месяц и день даты date меньше месяца и дня dr, то вычитаем один год из предыдущего полученного значения, ибо человеку ещё не исполнилось столько годков.Ну да, если даты записаны в формате yyyy-mm-dd эта формула вполне пойдет... до тех пор пока кто-нибудь не запишет дату в формате dd.mm.yyyy.

Когда я говорил про неправильное вычисление дат я именно на это и намекал. Если хочешь правильно считать даты - считай их или в юлианском или в юниксовом форматах. Либо разрезай дату на день, месяц и год и считай их по отдельности.
Простое date-dr пойдет только дат записанных как число.

tororo2. Я не умею Си. Си уметь надо. Это мать всех современных языков, систем и библиотек.

tororo2. И, насколько я могу понять, это будет не встроенная прямо в файл БД функция, а нечто хранящееся извне.
К примеру, я видел пример, как делать подобную пользовательскую функцию на питоне. Но мне-то надо, что представление (view), хранимое в самой БД, умело вычислять возраст исходя из двух дат. А потом, в питоне, уже просто получить результат запроса с уже вычисленными возрастами. Или не в питоне, в любом другом языке, но получить то же самое. В SQLite не бывает функций встроенных в БД. Бывают функции встроенные в движок, но тогда это уже получается уникальный движок которым надо будет заменять оригинальный.

В общем, бери документацию на модуль sqlite к твоему любимому языку. Смотри, есть ли в этом модуле возможность создавать пользовательские функции. Если нет: либо бери другой модуль, либо другой язык, либо другую СУБД. Либо изучай особенности выбранной СУБД и учитывай их.
...
Рейтинг: 0 / 0
Как вычислить возраст исходя из двух дат в полях БД sqlite?
    #38408927
tororo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторА ты знаешь что в SQLite нету типа данных "дата"?
Знаю.

авторНу да, если даты записаны в формате yyyy-mm-dd эта формула вполне пойдет... до тех пор пока кто-нибудь не запишет дату в формате dd.mm.yyyy.
Я не дам ему этого сделать! Вот так прям сразу ему и скажу: руки оборву!
А если серьёзно, это моя БД, данные в неё вносятся только через мою программу. А уж она проследит, чтобы дата вносилась так как надо.

авторСи уметь надо
Умей. Я обойдусь. Один лишь синтаксис его бесит неописуемо со всеми его закорючками, запятучками, двойными двоеточками, фигурными скобками, дурацкими повторениями текста при создании экземпляров классов и т.д. Без обид, это лишь моё мнение.

авторСмотри, есть ли в этом модуле возможность создавать пользовательские функции
Есть.
Но мне нужно чтобы возраст умел высчитывать запрос (представление) хранимый в самой БД, а не формирующийся средствами внешнего языка программирования.
...
Рейтинг: 0 / 0
Как вычислить возраст исходя из двух дат в полях БД sqlite?
    #38408949
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tororoУмей. Я обойдусь. Один лишь синтаксис его бесит неописуемо со всеми его закорючками, запятучками, двойными двоеточками, фигурными скобками, дурацкими повторениями текста при создании экземпляров классов и т.д. Без обид, это лишь моё мнение.Ненависть к языку не означает что его не надо знать.
А я вот Питон ненавижу. Я еще и С++ не выношу. И к C# с Java отношусь чрезвычайно отрицательно и сам никогда не выберу эти языки для своих проектов. Что тем не менее не мешает мне уметь писать на них и исправлять-дополнять проекты написанные на этих языках.
Потому-то я эти языки и ненавижу что я их знаю :)

tororoавторСмотри, есть ли в этом модуле возможность создавать пользовательские функции
Есть.
Но мне нужно чтобы возраст умел высчитывать запрос (представление) хранимый в самой БД, а не формирующийся средствами внешнего языка программирования.Ну так и будет представление...
Оно будет работать только в том случае если работает твоя программа, да. Но это для всех остальных частей твоей программы это будет самое обычное представление.
...
Рейтинг: 0 / 0
Как вычислить возраст исходя из двух дат в полях БД sqlite?
    #38410335
tororo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автори исправлять-дополнять проекты написанные на этих языках.
А мне сие совершенно не грозит.
Я не зарабатываю на жизнь программированием.
Так что для своих скромных нужд обойдусь питоном.
...
Рейтинг: 0 / 0
Как вычислить возраст исходя из двух дат в полях БД sqlite?
    #38538017
Medvedoc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SELECT strftime('%J',date(наименование столбца первой даты)) - strftime('%J',date(наименование столбца второй даты)) from [наименование таблицы];
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как вычислить возраст исходя из двух дат в полях БД sqlite?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]