пытаясь получить возраст от даты рождения - PullRequest
0 голосов
/ 14 февраля 2011
SELECT [ID_KUNDNR]
      ,CASE
       WHEN DA_FODELSEAR IS NULL THEN 0
       WHEN dateadd(year, datediff (year, DA_FODELSEAR, getdate()), DA_FODELSEAR) > getdate() THEN datediff (year, DA_FODELSEAR, getdate()) - 1
       ELSE datediff (year, DA_FODELSEAR, getdate())
       END As Age
      ,[Catalog]
  FROM Table

Я получаю

Сообщение 8115, уровень 16, состояние 2, строка 2 Ошибка арифметического переполнения при преобразовании выражения в тип данных datetime.

Есть какие-нибудь решения?

Ответы [ 3 ]

1 голос
/ 14 февраля 2011

Мне просто интересно, почему вы используете случай. Попробуйте ниже и посмотрите, работает ли он.

 SELECT [ID_KUNDNR] ,
    datediff (year, 0, (getdate()-DA_FODELSEAR)) as Age,
    Catalog
    From Table

Но опять же вы уверены, что все значения DA_FODELSEAR конвертируются в datetime?

Если у вас возникли проблемы, попробуйте это.

 SELECT [ID_KUNDNR] ,
    Case When ISDATE(DA_FODELSEAR) = 0 Then 0 Else
        datediff (year, 0, (getdate()-DA_FODELSEAR)) 
        End as Age,
    Catalog
    From Table

Если вы хотите знать, какие строки вызывают эту проблему преобразования, выберите таблицу с 'где IsDATE (DA_FODELSEAR) = 0'

0 голосов
/ 14 февраля 2011

Вы должны убедиться, что DA_FODELSEAR имеет правильный формат даты и времени. Вы можете сделать это с помощью CAST(DA_FODELSEAR as DATETIME) и проверить.

0 голосов
/ 14 февраля 2011

Я думаю, что ваша проблема лежит здесь dateadd(year, datediff(year, DA_FODELSEAR, getdate()), DA_FODELSEAR).У вас есть значение в вашем DA_FODELSEAR, которое не в формате DATETIME.Я бы запустил оператор SELECT, чтобы найти ошибочное значение.Вы проверяете на NULL а как насчет пробела?

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