powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / 2 Хранение дат за любой период 2
38 сообщений из 38, показаны все 2 страниц
2 Хранение дат за любой период 2
    #32061750
Фотография MarchCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот и я пришел к выводу что:
1. Любое событие имеет начало и конец, точная дата это крайний вариант.
2. Для быстрого поиска нужно будет хранить дату события в разных шкалах. Естественно нужен, будет интеллектуальный поиск (терпеть не могу тупые программы)

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

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

to akuz!
Молчи родной, молчи. Я и так все выдал 8ж)
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062045
Фотография TBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все молчат, ну как тут не встрять...

Пример. Захочется тебе указать, что в такую-то лунную ночь такой-то допотопной эры родился такой-то карапуз, а через 20 годиков у него было уже семеро детей... Тут-то тебе и станет очень плохо, с логарифмической-то шкалой и мелкими годами, а тем более - днями в ней. Ежели такое не понадобится - логарифмируй, ну и т.д., аппроксимируй, короче... :) А если захочешь указывать что-то более точное (даже годы, не говоря уж о днях), то без предлагаемой мною функции (см. предыдущий тред) ИМХО ничего не получится -- тут уже точные числа нужны. ;)

Впрочем, я сегодня не опохмелялся -- это оправдание на случай, если все же ошибаюсь... :)
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062049
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все молчат, ну как тут не встрять...
Сказали молчать, я и молчу.
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062087
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока ты не прекратишь темнить, а нафиг тебе сдалась эта машина времени, конкретного ответа на получишь. У меня есть еще идея, но публиковать я ее не буду. Вдруг это не подойдет, а я буду впустую клавиши месить. Если это совсекретно, пиши на мыло.

Мой девиз - познание мира невозможно, но нужно и можно изучать конкретные процессы.

Сат2. Традиция: агностик-скептицист.
==========
Уважаемые посетители! Не пинайте меня за обращение на ТЫ. Просто мы с Мартовским Котом уже довольно давно виртуально знакомы.
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062646
Оля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To MarchCat & Everybody


Может, у кого формула есть -количество полных лет с даты рождения на определенную дату.

Деление на 365 не предлагать!!!
Безусловно, можно через функцию, но нужна формула

P.S. Ну конечно, дата рождения и определенная дата в таблице, а таблица в БД, а БД на SQL Server.... :-))

Заранее спасибо.
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062664
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Оля
Надеюсь вас не интерисует количество полных лет Лао Цзы в 341 г. д.н.э.

Тогда DATEDIFF(yy, birhdate, date).

Зачем нужна формула? Ааа понял! Это шутка!
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062783
Оля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Akuz

Никаких шуток!
> Тогда DATEDIFF(yy, birhdate, date).
Вы это выражение пробовали?

У меня не получается, т.е.
Если человек родился 21.09.2000, а определенная дата 1.02.2001 , то DATEDIFF(yy, birhdate, date)=1.
Если 1.01.2001 родился, а определенная дата 1.02.2001 , то DATEDIFF(yy, birhdate, date)=0.

Или у меня с SQL что-то не так?
_________________________
А формула есть, мне ее прислали из центра биостатистики из Франции.
А я ее куда-то .....
Писать туда еще раз неудобно, вот решила в тему и спросить...
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062814
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А сколько по вашему полных лет месячному ребёнку?
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062828
Оля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Akuz

>А сколько по вашему полных лет месячному ребёнку?
Мне не нужно по-моему.
Мне нужно по-медицинскому.
И в обоих вышеприведенных случаях должно быть 0 полных лет.
SQL дает в первом случае 1, во втором 0, т.е. он отнимает только года друг от друга.

.... ФОРМУЛУ ....
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062841
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
declare @d1 datetime, @d2 datetime
select @d1 = '20000921', @d2 = '20010201'

select @d2 - @d1, DATEDIFF(yy,  0 , @d2 - @d1)
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062864
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняйте был не прав, стал забывать основы. :)

alexeyvg вовремя поправил, добавлю лишь

Код: plaintext
select DATEADD(d,- 1 ,@d2 - @d1), DATEDIFF(yy,  0 , DATEADD(d,- 1 ,@d2 - @d1))
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062875
Оля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за внимание к проблеме!

НО, если даты 27.02.1996 и 26.02.1997, то ошибка у alaxeyvg.
если даты 27.02.1995 и 26.02.1996, то ошибка у akuz.


Еще несколько часов уборки в столе, комнате, документах и я найду эту ф-лу (может быть). Самое обидное, что я ее и не смотрела, может быть тогда бы зрительно запомнила.
Вы пытаетесь решить средствами SQL (и спасибо!), а там точно была примитивная математика.
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062877
Оля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Everybody

Может, кто кадры делал: количество полных лет стажа и т.п.?
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062880
Оля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения, читать надо:

если даты 27.02.1995 и 27.02.1996, то неправильно количество полных лет у akuz.


P.S.Господа, все равно спасибо!
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062906
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare @d1 datetime, @d2 datetime

select @d1 = '19960227', @d2 = '19980226'
select year(@d2)-year(@d1)
	-case when datepart(dy,@d2)>=datepart(dy,@d1) then  0  else  1  end
 --27.02.1996 и 26.02.1997
 

select @d1 = '19950227', @d2 = '19960226'
 --27.02.1995 и 26.02.1996
 
select year(@d2)-year(@d1)
	-case when datepart(dy,@d2)>=datepart(dy,@d1) then  0  else  1  end
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062911
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так будет быстрее и проще....
Код: plaintext
1.
2.
3.
4.
5.
DECLARE @D1 DATETIME, @D2 DATETIME
SELECT @D1 = '19960227', @D2 = '19980226'
SELECT CAST(DATEDIFF(DD,@D1,@D2)/ 365 . 26  AS INT)

SELECT @D1 = '19950227', @D2 = '19960226'
SELECT CAST(DATEDIFF(DD,@D1,@D2)/ 365 . 26  AS INT)
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062913
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
немного не точно.... для нашего "григорианского" календаря надо делить на 365,2425....
а для "тропического" или тн "(солнечного)" на 365,242199
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062914
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и так для справки....
ГОД
, промежуток времени, приблизительно равный периоду обращения Земли вокруг Солнца. В астрономии различают:

1) сидерический (звездный) год, соответствующий одному видимому обороту Солнца по небесной сфере относительно неподвижных звезд; составляет 365,2564 средних солнечных суток;

2) тропический год - промежуток времени между двумя последовательными прохождениями центра истинного Солнца через точку (среднюю) весеннего равноденствия (365,2422 сут);

3) аномалистический год - промежуток времени между двумя последовательными прохождениями центра Солнца через перигей его видимой геоцентрической орбиты (365,2596 сут);

4) драконический год, соответствующий времени между двумя последовательными прохождениями Солнца через один и тот же (восходящий или нисходящий) узел орбиты Луны на эклиптике (346,6200 сут); продолжительность всех годов приведена для 1900;

5) календарный год, составляющий 365 сут для простых годов и 366 сут для високосных годов;

6) лунный год продолжительностью 12 лунных синодических месяцев (в среднем 354,367 сут).
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062923
Еще один вариант:
Код: plaintext
1.
SELECT DateDiff(year, DateAdd(day,  1  - DatePart(dayofyear, @d1) , @d1), DateAdd(day,  1  - DatePart(dayofyear, @d1), @d2))
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062956
Оля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To MiCe
Спасибо, для общих расчетов все отлично.
Но
DECLARE @D1 DATETIME, @D2 DATETIME
SELECT @D1 = '19950227', @D2 = '19960227'
SELECT CAST(DATEDIFF(DD,@D1,@D2)/365.26 AS INT)
0 полных лет
_________________________

To Cat2
Спасибо, использует специфические функции SQL.
--------------------------------
Просто есть конкретные прикладные задачи

1. Установить количество полных лет на момент диагноза и есть правила, которые диктуются международнами организациями здравоохранения, им теория не нужна, и SQL не нужен.
2. Количество полных лет стажа - правила диктуются законодательной базой, им тоже теория не нужна и SQL не нужен.

3. Возраст на момент совершения преступления и т.п.

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



----------------------
Уборка на рабочем месте не помогла :-(((
Берусь за карандаш и листок бумаги :-))))
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32062987
Фотография akuz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, в таком случае совет один.

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

Там всё должно быть, хотя я думаю там, скорее всего, приведён алгоритм расчёта, а не формула.

Попробуйте в поисковике поискать. :)
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32063106
Оля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To akuz

Да правило у них всех простое, как грабли
Количество полных лет на момент заболевания (выхода на пенсию, свершения преступления и т.п.)

Да, собственно, уже получилось :-)). Наверное, подумать было лень.


Всем спасибо!
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32063566
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 оля
SELECT @D1 = '19950227', @D2 = '19960227'
день рождения? а сколько должно быть? имхо полный год только после полуночи... то есть на следующий день!...
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32063779
Оля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Mice
Верно подмечено, но согласно всем перечисленным задачам, если дата рождения 1995.02.27 то на 0 часов 0 минут 1996.02.27 наступает 1 год.
Т.е. в этих задачах принимается, что человек родился в 0 ч 0 мин.

А так здорово праздновать день рождения целый день, а потом еще и еще....;-)))
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32067008
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
SELECT CAST((DATEDIFF(DD,@D1,@D2)+ 1 )/ 365 . 2425  AS INT) 

так всегда верно?
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32067031
Случайный прохожий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения, мимо проходил и встрял.

А вот так не вкуснее будет:
floor(datediff(mm,@d1,@d2)/12)
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32067038
Фотография Лëля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To MiCe
Отвечает бывшая Оля, наконец я зарегистрировалась на форуме как Лëля

>так всегда верно?

Всегда - не бывает. Для моей задачи неверно.
Родился 27.02.1996
Заболел 26.02.1997
Нет ему года на момент заболевания, а Ваш расчет дает год.
Оцените громоздкость и надежность этого выражения
Оно на самом деле м.б. не привязано к ф-циям SQL сервера, хотя я его написала в ф-циях SQL. Т.е. можно хранить отдельно год, месяц, день как целые числа и не привязываться к типам данных, связанных с датой-временем.

Код: plaintext
1.
FLOOR(DATEPART(year, @D1) - DATEPART(year, @D2) + (DATEPART(month, @D1) - DATEPART(month, @D2)) 
                      /  12 . 0  + (DATEPART(day, @D1) - DATEPART(day, @D2)) /  365 . 0 )


__________________
MiCe, спасибо за участие!
Поздравляю еще раз с рождением сына!
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32067043
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что делать если человек родился 29 февраля?(по закону)
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32067045
Фотография Лëля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В след. году 28.02 ему нет года, на 1.03 - есть
По-моему, так ....
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32067048
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пасибки.... главное не забыть...
а решение действительно унивирсальное....
может в FAQ?
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32067090
Фотография Alexes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
datepart(yyyy,@dt2)-datepart(yyyy,@dt1)+sign(sign(datepart(mm,@dt2)* 100 +datepart(dd,@dt2)-datepart(mm,@dt1)* 100 -datepart(dd,@dt1))+ 1 )- 1 
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32067096
Фотография TBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ого, сколько тут понаписали, и все без меня! :)

Леля, формула, может, и хороша (не проверял), но из академических соображений делить следует на число, чуть большее, чем 365, а не ровно на 365.

А вообще это наверняка не всегда корректная формула, когда-то давно, когда я делал программу "Биоритмы", я в этой программе учитывал и високосные годы, и сотые годы... Это была одна формула с выражениями по модулю. Если в инете поищете, то наверняка найдете.

Кредо: добавь ложку дегтя вместо воды! ;)
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32067099
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 TBB
а ты проверь.... ;))
здесь же не вычисляют разницу в днях...
вычисляется сколько полных лет между датами...
на счет деления.... у нее floor... этого достаточно
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32067120
Фотография Лëля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Леля, формула, может, и хороша (не проверял), но из академических соображений делить следует на число, чуть большее, чем 365, а не ровно на 365.

To TBB

Могу сказать, что делить можно и на 361, 362, etc.
Дни начинают играть, когда месяцы одинаковые, задача третьей части формулы - попасть по модулю в промежуток [0;1/12[. Масимальная разница между днями 30 единиц, соответственно 361- будет достаточно.

Я понятно объяснила? :-))))
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32067125
Фотография TBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а ты проверь.... ;))
Чего именно? :)

здесь же не вычисляют разницу в днях...
Здесь предложили в FAQ поместить, а в формуле дни вполне себе вычисляются.

на счет деления.... у нее floor... этого достаточно
Делить можно и на 1000, а не на 365, хуже вычисляться не будет, но затуманит понимание. Я же сказал "из академических соображений"... :)

Дни начинают играть, когда месяцы одинаковые, задача третьей части формулы - попасть по модулю в промежуток [0;1/12
Вот это - точно! :)
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32067309
Фотография Лëля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Alexes

Спасибо, высший пилотаж!

И очень "академично" - позиционное разнесение и реализация сравнения.

Мне нравится!
-----------
Всем спасибо!
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32067337
Axr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть решение без делений и умножений (а также логарифмов и интегралов):

1. T-SQL

Код: plaintext
1.
2.
3.
4.
@y2-@y1-case
              when (@m2<@m1 or (@m2=@m1 and @d2<@d1))
              then  1 
              else  0 
              end

2. Практически любой язык (с математической функцией MAX())

Код: plaintext
y2-y1-max(sign(m1-m2+max(sign(d1-d2), 0 )), 0 )
...
Рейтинг: 0 / 0
2 Хранение дат за любой период 2
    #32067822
Фотография Лëля
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
Тоже нравится!

Теперь у меня 3 варианта формулы и можно говорить о производительности каждого из них :-)))
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / 2 Хранение дат за любой период 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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