Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7   вперед  Ctrl      все
 Даты в MS SQL Server  [new]
Patucho
Member

Откуда: Киев
Сообщений: 16
Добрый день!
Подскажите пожалуйста, как правильно посчитать возраст человека используя дату рождения и getdate()
Пробовал ч\з ф-ю DATEDIFF:

DATEDIFF(YEAR,b.birthdate,getdate()) as age

Но таким образом не учитывается был ли д\р
1 окт 17, 11:27    [20834234]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
aleks222
Guest
ALTER FUNCTION [dbo].[Age] 
(	
	@Birthday datetime, 
	@Date datetime = null
)
RETURNS TABLE 
AS
RETURN 
( with dt0 as ( select [@Date] = isnull( @Date, getdate() ) )
     , dt as ( select [@Date], YearDiff = datediff( year, @Birthday, dt0.[@Date] ) from dt0 )
	select  Age = YearDiff
                  + ( sign( datediff(day, @Birthday, dateadd(year, -dt.YearDiff, dt.[@Date] ) ) ) - 1 ) / 2
	  from dt
)


Идея iap.
1 окт 17, 12:07    [20834280]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
Patucho
Member

Откуда: Киев
Сообщений: 16
aleks222, спасибо!

но хотелось бы реализовать это в запросе
1 окт 17, 12:25    [20834312]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
iap
Member

Откуда: Москва
Сообщений: 44949
Определение возраста по дате рождения и тек.дате
1 окт 17, 13:08    [20834376]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
iap
Member

Откуда: Москва
Сообщений: 44949
Как быстро определить сколько лет человеку по дате рождения
Это ещё более ранняя тема
1 окт 17, 13:11    [20834378]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
aleks222
Guest
Patucho
aleks222, спасибо!

но хотелось бы реализовать это в запросе


Дык, "в запроснее некуда".

Честное пионерское - это запрос.
1 окт 17, 13:55    [20834468]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 515
А что, обычный запрос уже не катит?
1.0 * DATEDIFF( DAY, @birthdate, GETDATE() ) / 30.4375

плюс-минус километр
1 окт 17, 15:15    [20834568]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
Massa52
Member

Откуда:
Сообщений: 218
Руслан Дамирович,
DECLARE 	@birthdate datetime = '19520102' 
SELECT
1.0 * DATEDIFF( DAY, @birthdate, GETDATE() ) / 30.4375

Результат = 788.96098562
1 окт 17, 15:58    [20834604]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
MKDT
Guest
select YEAR(D)-YEAR(b.birthdate)-IIF(MONTH(b.birthdate)*100+DAY(b.birthdate)>=MONTH(D)*100+DAY(D),0,1)
from (select GETDATE()) D(D)
1 окт 17, 20:23    [20834869]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 515
Massa52
Руслан Дамирович,
DECLARE 	@birthdate datetime = '19520102' 
SELECT
1.0 * DATEDIFF( DAY, @birthdate, GETDATE() ) / 30.4375

Результат = 788.96098562

Тупанул. На 12 поделить - и "усе у порядке, шеф, клиент наш"
2 окт 17, 12:07    [20835937]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
vladislav109
Member

Откуда:
Сообщений: 57
А такой вариант?
YEAR(GETDATE()) - YEAR(@birthday) AS Age
2 окт 17, 12:59    [20836095]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
iap
Member

Откуда: Москва
Сообщений: 44949
vladislav109
А такой вариант?
YEAR(GETDATE()) - YEAR(@birthday) AS Age
Должно быть до дня рождения - одно, а после - другое (на 1 больше)!
А у вас получится одно и то же.
2 окт 17, 13:07    [20836133]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 515
iap
Должно быть до дня рождения - одно, а после - другое (на 1 больше)!

Третья попытка
DECLARE @birthdate DATE = '19521003'
DECLARE @getdate DATE = GETDATE()

-- by meh
DECLARE @base INT = FLOOR( 1.0 * DATEDIFF( MONTH, DATEADD( DAY, 1 - DATEPART( DAY, @birthdate ), @birthdate ), DATEADD( DAY, 1 - DATEPART( DAY, @getdate ), @getdate ) ) / 12 )
SELECT FLOOR( @base - DATEDIFF( DAY, DATEADD( YEAR, @base, @birthdate ), @getdate ) / 30.4375 )

-- by aleks222
DECLARE @yeardiff INT = DATEDIFF( YEAR, @birthdate, @getdate )
SELECT [age] = @yeardiff + ( SIGN( DATEDIFF(DAY, @birthdate, DATEADD(YEAR, -@yeardiff, @getdate ) ) ) - 1 ) / 2
2 окт 17, 18:15    [20837148]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 515
шлак получился :) тестирование на массиве дат уже не прошел.
2 окт 17, 18:24    [20837157]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 515
Фигней какой-то страдаем...
IF OBJECT_ID( '[zr].[calculate_age]' ) IS NOT NULL
  DROP FUNCTION [zr].[calculate_age]
GO
CREATE FUNCTION [zr].[calculate_age](
  @birthdate DATE,
  @date DATE )
RETURNS INT
AS
BEGIN
  DECLARE @y INT = DATEDIFF( YEAR, @birthdate, @date );
  DECLARE @m INT = DATEDIFF( MONTH, DATEADD( YEAR, @y, @birthdate ), @date );
  DECLARE @d INT = DATEDIFF( DAY, DATEADD( MONTH, @m, DATEADD( YEAR, @y, @birthdate ) ), @date );
  RETURN @y + CASE WHEN SIGN( @m ) = 1 THEN 0 WHEN SIGN( @m ) = -1 THEN -1 WHEN SIGN( @d ) = 1 THEN 0 WHEN SIGN( @d ) = -1 THEN -1 ELSE 0 END
END
GO
IF OBJECT_ID( 'tempdb..#dates' ) IS NOT NULL
  DROP TABLE #dates
;
WITH
cte AS (
  SELECT
    [date] = CONVERT( DATE, '20150101' )
  UNION ALL
  SELECT
    [date] = DATEADD( DAY, 1, cte.[date] )
  FROM
    cte
  WHERE
    cte.[date] < CONVERT( DATE, '20181231' )
)
SELECT
  *
INTO
  #dates
FROM
  cte
OPTION (
  MAXRECURSION 0 
)
;
SELECT
  *,
  [zr].[calculate_age]( '19521003', [date] )
FROM
  #dates
;
2 окт 17, 18:37    [20837176]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1211
Руслан Дамирович
Фигней какой-то страдаем...
Как обычно, когда вопрос стоит об определении длины диапазона дат. Уж сколько раз твердили миру, что универсальны простых способов рассчитать длину диапазона дат в единицах, превышающих по размеру декаду, нет в природе, а воз и ныне там... Все равно вечный двигатель пытаются изобрести...
3 окт 17, 09:08    [20837923]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 3854
Sergey Sizov
Руслан Дамирович
Фигней какой-то страдаем...
Как обычно, когда вопрос стоит об определении длины диапазона дат. Уж сколько раз твердили миру, что универсальны простых способов рассчитать длину диапазона дат в единицах, превышающих по размеру декаду, нет в природе, а воз и ныне там... Все равно вечный двигатель пытаются изобрести...

что за хрень я прочитал?
3 окт 17, 09:32    [20837979]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 515
Sergey Sizov
Все равно вечный двигатель пытаются изобрести...

Вечный двигатель только идиоты пытаются изобрести, а "умные" люди вроде меня - изобретают велосипеды
3 окт 17, 10:16    [20838118]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1211
TaPaK
Sergey Sizov
пропущено...
Как обычно, когда вопрос стоит об определении длины диапазона дат. Уж сколько раз твердили миру, что универсальны простых способов рассчитать длину диапазона дат в единицах, превышающих по размеру декаду, нет в природе, а воз и ныне там... Все равно вечный двигатель пытаются изобрести...

что за хрень я прочитал?
Для лучшего понимания сей хрени попробуйте ответить на вопрос "Сколько месяцев и дней между 29 января и 30 марта? То есть какова длина указанного диапазона дат в месяцах и днях? Варианты ответа:
1. 1 мес. и 30 д.
2. 2 мес. и 1 д.
3. 2 мес.
3 окт 17, 10:17    [20838120]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 3854
Sergey Sizov
TaPaK
пропущено...

что за хрень я прочитал?
Для лучшего понимания сей хрени попробуйте ответить на вопрос "Сколько месяцев и дней между 29 января и 30 марта? То есть какова длина указанного диапазона дат в месяцах и днях? Варианты ответа:
1. 1 мес. и 30 д.
2. 2 мес. и 1 д.
3. 2 мес.

в миниматных всегда единицах считать - днях. Клиенту показывать как прикажет.

Вы ещё и не знаете что такое декада
3 окт 17, 10:20    [20838136]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 515
Sergey Sizov
TaPaK
пропущено...

что за хрень я прочитал?
Для лучшего понимания сей хрени попробуйте ответить на вопрос "Сколько месяцев и дней между 29 января и 30 марта? То есть какова длина указанного диапазона дат в месяцах и днях? Варианты ответа:
1. 1 мес. и 30 д.
2. 2 мес. и 1 д.
3. 2 мес.

Задача конкретная, свои размышления оставьте для комнаты уединения.
А IAP уже изобрел все аж в 2009 году
6737306
Мой вариант чуть-чуть не дотянул до его версии.
3 окт 17, 10:23    [20838142]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1211
Руслан Дамирович
Sergey Sizov
Все равно вечный двигатель пытаются изобрести...

Вечный двигатель только идиоты пытаются изобрести, а "умные" люди вроде меня - изобретают велосипеды
Так в том то и дело, что велосипеда тут нет. Есть несколько разных методик расчетов разных стажей. А стаж - это ведь как раз длина диапазона дат, выраженная в годах/месяцах/днях, не так ли? И как минимум две из упомянутых единиц измерения, а именно месяц и год, не имеют фиксированного размера в других единицах измерения. Особенно это касается месяцев. И самого яркого их представителя - февраля.
3 окт 17, 10:25    [20838149]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1211
Руслан Дамирович
Sergey Sizov
пропущено...
Для лучшего понимания сей хрени попробуйте ответить на вопрос "Сколько месяцев и дней между 29 января и 30 марта? То есть какова длина указанного диапазона дат в месяцах и днях? Варианты ответа:
1. 1 мес. и 30 д.
2. 2 мес. и 1 д.
3. 2 мес.

Задача конкретная, свои размышления оставьте для комнаты уединения.
А IAP уже изобрел все аж в 2009 году
6737306
Мой вариант чуть-чуть не дотянул до его версии.
Увы, но задача отнюдь не конкретная. Ибо не указан для чего и по какой методике считать возраст. А от этого результат расчета может сильно поменяться. И приведенные мной варианты ответов как раз это и демонстрируют ибо они ВСЕ ПРАВИЛЬНЫЕ. Но для разных методик. Еще раз - НЕТ одного универсального способа и ответа.
3 окт 17, 10:29    [20838156]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1211
TaPaK
Sergey Sizov
пропущено...
Для лучшего понимания сей хрени попробуйте ответить на вопрос "Сколько месяцев и дней между 29 января и 30 марта? То есть какова длина указанного диапазона дат в месяцах и днях? Варианты ответа:
1. 1 мес. и 30 д.
2. 2 мес. и 1 д.
3. 2 мес.

в миниматных всегда единицах считать - днях. Клиенту показывать как прикажет.
Так вот как раз как показать? Как дни пересчитать в месяцы? В какие месяцы? А как год учитывать?

Вы ещё и не знаете что такое декада
Да что вы говорите? Читать мое сообщение внимательней не пробовали?
3 окт 17, 10:31    [20838166]     Ответить | Цитировать Сообщить модератору
 Re: Даты в MS SQL Server  [new]
iap
Member

Откуда: Москва
Сообщений: 44949
Sergey Sizov
TaPaK
пропущено...

что за хрень я прочитал?
Для лучшего понимания сей хрени попробуйте ответить на вопрос "Сколько месяцев и дней между 29 января и 30 марта? То есть какова длина указанного диапазона дат в месяцах и днях? Варианты ответа:
1. 1 мес. и 30 д.
2. 2 мес. и 1 д.
3. 2 мес.
Зависит от полной даты 29 января!
Но точный ответ всегда существует.
3 окт 17, 10:33    [20838180]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5 6 7   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить