2014-10-24 4 views
0

Я знаю, что существует множество способов расчета разницы между датами в разных базах данных. Моя проблема в том, что мне нужен способ сделать это, что будет работать как в SQL Server, так и в DB2, используя тот же SQL-запрос.Расчет разницы между двумя датами в SQL Server и DB2

На ежегодной основе можно использовать

CURRENT_TIMESTAMP - [BIRTHDATE] AS AGETHISYEAR 

Но я также хочу знать возраст лиц в десятичной форме, т.е. 34,4 в зависимости от рождения людей и текущей даты.

В SQL Server тип columntype для [BIRTHDATE] равен DATETIME, а в DB2 тип столбца - DATE.

Формат YYYY-MM-DD

Есть ли способ сделать это?

С уважением, Альфред

+0

SELECT DATEDIFF (YY, BIRTHDATE, CURRENT_TIMESTAMP) вернет целое число лет, я не понимаю десятичную часть, вы хотите долю года до его следующей даты рождения? –

+0

Сделайте датичный день и разделите его на 365.25. Однако, поскольку sql-сервер и db2 имеют разные функции, которые дают вам разницу между двумя датами, вы не сможете использовать либо, если хотите иметь точно такой же sql. –

+0

Я думаю, что у вас есть свои типы данных назад - DB2 не имеет 'DATETIME', а более ранние версии SQL Server не имеют' DATE'. Кажется, вы не можете вычитать даты таким образом в SQL Server, и в результате этого в DB2 получается число, содержащее 10 цифр (вам нужно разделить). @DanBracuk - DB2 не имеет 'DATEDIFF', а' TIMESTAMPDIFF' it _does_ возвращает ** оценку **. –

ответ

1

Я думаю, что единственный способ, которым Вы можете написать функцию, которая будет работать в обеих базах данных будет использовать year(), month() и day() или писать функции самостоятельно. В функциях даты между этими двумя базами данных не так много совпадений.

Например, чтобы получить полные лет между двумя датами, вы можете использовать:

select (year(CURRENT_TIMESTAMP) - year(birthdate) + 
     (case when month(CURRENT_TIMESTAMP) * 100 + day(CURRENT_TIMESTAMP) < 
        month(birthdate) * 100 + day(birthdate) 
       then -1 else 0 
     end) 
     ) as AgeInYears 

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

+0

Ваш способ рассчитать возраст человека хорош. Я тоже буду использовать это (нужно возраст, основанный на тотальном году и фактической дате сегодня). Когда дело доходит до дробных лет, я решил использовать 360/30-метод, поэтому просто беру год умножить его на 360 дополнительных месяцев * 30 плюс дни. Я делаю это для current_timestamp и [BIRTHDATE] вычитает его и, наконец, делит на 360. Это работает отлично! – Alfred

+0

@Alfred - Вы знаете, что есть несколько моментов, когда ваш расчет вернет человека старше или моложе, чем они есть на самом деле, не так ли? Я не знаю, является ли это проблемой регулирования для вас ... –

+0

@ Clockwork-Muse Я проверял совсем немного и не нашел случая, когда расчетный возраст не отображается правильно. – Alfred

Смежные вопросы