Man Down Ответов: 1

Msg 241, уровень 16, состояние 1, строка 1 преобразование не удалось при преобразовании даты и / или времени из символьной строки.


Это мой запрос , когда я выполняю запрос, я получаю этот erorr:
Msg 241, Уровень 16, состояние 1, строка 1 преобразование не удалось при преобразовании даты и / или времени из символьной строки.

И для того, чтобы найти проблему, я проверил и проверил каждый функция DateDiff в моем запросе
и я ничего не нахожу ! может быть, я ошибаюсь ,может быть, есть что-то, чего я просто не вижу ,
итак, может кто-нибудь, пожалуйста, помочь и указать мне правильное направление. Спасибо.

SELECT
    X, X + ' ' + X AS X,
    X AS X, 
    CASE 
    WHEN X IS NOT NULL THEN
    DATEDIFF(YEAR,CONVERT(date,STUFF(LEFT(X, 4), 3, 0, '.') + '.' + CAST(DATEPART(YEAR, GETDATE()) / 100 - 1 as char(2)) + SUBSTRING(X, 5, 2), 104) , GETDATE()) 
    ELSE
    NULL
    END As X ,
    
     (CASE WHEN right(rtrim(X), 1) IN ('1', '3', '5', '7', '9') THEN 'M'
                 WHEN right(rtrim(X), 1) IN ('2', '4', '6', '8', '0') THEN 'K'
            END) as X,
    
    Convert(varchar(10), X, 104) AS X ,
    
    (CASE WHEN X IS NOT NULL
          THEN CAST(DATEDIFF(YEAR, X, X) as VARCHAR(255))
          ELSE (CAST(DATEDIFF(year, X, GETDATE()) AS varchar(4)) +' year ' +
                CAST(DATEDIFF(month, DATEADD(year, DATEDIFF(year, X, GETDATE()), X), GETDATE()) AS varchar(2)) +' month ' +
                CAST(DATEDIFF(day, DATEADD(month, DATEDIFF(month, DATEADD(year, DATEDIFF(year, WorkStartDate, GETDATE()), WorkStartDate), GETDATE()), DATEADD(year, DATEDIFF(yy, WorkStartDate, GETDATE()), WorkStartDate)), GETDATE()) AS varchar(2)) +' day'
              )
    END) as X,
    
    X AS Afdelinger
    
    FROM Y  INNER JOIN Y ON Y=Y
    WHERE Y order by Y;


Что я уже пробовал:

я проверил и проверил каждый DATEDIFF в своем запросе

1 Ответов

Рейтинг:
2

OriginalGriff

Проверьте свой CONVERT(date, STUFF(... код и данные, с которыми он работает (которые мы не видим, у нас нет доступа к вашей базе данных) - ошибка заключается в том, что символьная строка (вероятно, результат операции STUFF) не может быть преобразована в дату или время, так что это наиболее вероятный виновник.
Мы не можем сделать это за вас - у нас нет доступа к вашей базе данных.


SSN выглядит так для ex, 1111112222 (DDMMYY-XXXX), и sql, который я написал, выберет 4 первых числа слева (день рождения) и разделит их на'.', а затем возьмет текущее время минус день рождения = дайте мне возраст сотрудников, все это о том, чтобы найти возраст сотрудников из их SSN.я просто отделяю select и снова получаю эту ошибку : преобразование не удалось при преобразовании даты и/или времени из символьной строки.



Если формат DDMMYYSSSS, то не берите первые четыре-возьмите первые шесть в битах и используйте их. Если вы посмотрите на то, что генерирует ваш материал, это "11.11", что вообще не является датой.
Если вы используете SQL Server 2012 или выше, то есть функция DATEFROMPARTS, которая должна помочь.
Вот функция, которая извлекает дату для вас:

CREATE FUNCTION GetDateFromSSN (@SSN NVARCHAR(10))
RETURNS DATE
AS
BEGIN
    DECLARE @Result DATE
    DECLARE @Y INT
    DECLARE @M INT
    DECLARE @D INT
    SET @Y = CONVERT(INT, SUBSTRING(@SSN, 5, 2))
    IF @Y > 17  SET @Y = @Y + 1900 ELSE SET @Y = @Y + 2000
    SET @M = CONVERT(INT, SUBSTRING(@SSN, 3, 2))
    SET @D = CONVERT(INT, SUBSTRING(@SSN, 1, 2))
    SET @RESULT = DATEFROMPARTS(@Y, @M, @D)
    RETURN @Result    
END
И он прост в использовании:
DECLARE @SSN NVARCHAR(10)
SET @SSN = '1112132222'
SELECT dbo.GetDateFromSSN(@SSN)


Man Down

Спасибо за ваш комментарий.

OriginalGriff

Поэтому посмотрите на имеющиеся у вас значения, определите, какие из них не работают, и сравните их с документацией:
https://en.wikipedia.org/wiki/Personal_identification_number_ (Дания)
Правда, мы не можем сделать это для вас!

Man Down

снова подняв. я проверю, и я не хочу, чтобы кто-то делал это за меня , я хочу сделать это сам,поэтому я задал этот вопрос

OriginalGriff

Это нормально - мы просто привыкли к людям, которые думают, что мы должны делать весь код для них! :смеяться:

Man Down

я всегда пытаюсь выяснить это сам, а если нет ,то задаю вопрос ,и на этот вопрос я трачу 3 дня, чтобы решить его, но до сих пор у меня ничего нет,и это сводит меня с ума :D

OriginalGriff

Молодец! Слишком много людей сдаются в самом начале.
Итак, с какими SSN вы имеете дело и что они генерируют после этого материала?
Извлеките бит материала в отдельный выбор и посмотрите на пару, чтобы увидеть, что вы получаете.

Man Down

SSN выглядит так для ex, 1111112222 (DDMMYY-XXXX), и sql, который я написал, выберет 4 первых числа слева (день рождения) и разделит их на'.', а затем возьмет текущее время минус день рождения = дайте мне возраст сотрудников, все это о том, чтобы найти возраст сотрудников из их SSN.я просто отделяю select и снова получаю эту ошибку : преобразование не удалось при преобразовании даты и/или времени из символьной строки.

OriginalGriff

Ответ обновлен.

Man Down

я написал что-то вроде вашего кода раньше,но моя проблема в том, что я работаю с этим проектом в SQL Server Reporting Services ( SSRS), эта программа не может принять что-то вроде вашего кода , это должно быть что-то вроде моего кода, как я спросил в своем вопросе, так как я могу преобразовать этот код в sql-сервер:

создать функцию dbo.birthdate_from_cpr (@cpr varchar(10))
дата возврата
как
начать
declare @year char(2) = substring(@cpr, 5, 2),
@month char(2) = подстрока (@cpr, 3, 2),
@day char(2) = подстрока (@cpr, 1, 2),
@century char(2)

-- если текущий 2-значный год меньше года рождения, предположим, что это был прошлый век
-- например, 76 должно быть 1976 годом, а 02-2002 годом .
если правильно(datepart(yy, getdate ()), 2) < @year
set @century = left(datepart(yy, getdate ()) - 100, 2)
ещё
set @century = left(datepart(yy, getdate ()), 2)


возвращение преобразования(дата, @В. + @год @месяц + @день 120)
конец
идти

выберите dbo.birthdate_from_cpr('1312761234'),
dbo.birthdate_from_cpr ('0101041234'),
age = datediff(yy, dbo.birthdate_from_cpr('1312761234'), getdate())

OriginalGriff

Я не использую SSRS, но вы можете включить в него код:
https://msdn.microsoft.com/en-us/library/ms156028.aspx?f=255&MSPPError=-2147217396
Таким образом, это должно быть осуществимо (и довольно просто, судя по всему), чтобы сделать это там, а не через функцию SQL.
Или, как вариант, напишите хранимую процедуру, чтобы вернуть нужные вам значения, и вызовите ее из SSRS (что, как я знаю, возможно).
Кстати: это очень хорошая идея, чтобы дать всю соответствующую информацию в вашем вопросе!

Man Down

tnx за ваше время и помощь

OriginalGriff

Пожалуйста!