Преобразование строки в dateTime в функции SQL Server CASE - PullRequest
0 голосов
/ 08 октября 2018

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

Я определил переменную @DueDate, которую я получаю из условий.

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

Сообщение 241, Уровень 16, Состояние 1, Процедура GetPayments, Строка 14 [Стартовая строка начала 0]
Преобразование не удалось при преобразовании даты и / или времени из строки символов.

Мой код:

 USE [Tenant Management]
 GO

 ALTER PROCEDURE [dbo].[GetPayments] 
     @DueDate AS DATETIME
AS
BEGIN
    SET NOCOUNT ON;
    SET @DueDate = 'select CASE rsp.[Frequency]  
                when ''1'' then CAST(DATEADD(MONTH, 12, rs.Last_Payment) as datetime)
                when ''2'' then CAST(DATEADD(MONTH, 6, rs.Last_Payment) as datetime)
                when ''3'' then CAST(DATEADD(MONTH, 3, rs.Last_Payment) as datetime)
                when ''4'' then CAST(DATEADD(MONTH, 1, rs.Last_Payment) as datetime)
                end
                from [dbo].[Reservation_Price] rsp
                inner join [dbo].[Reservations] rs on rsp.Reservation_ID = rs.ID';

    SELECT
        prs.[First Name] + ' ' + prs.[Middle Name] + ' ' + prs.[Last Name] AS [Tenant],
        c.Name as [Channel Name],
        CASE rsp.[Frequency] 
           WHEN '1' THEN DATEADD(MONTH, 12, rs.Last_Payment)
           WHEN '2' THEN DATEADD(MONTH, 6, rs.Last_Payment)
           WHEN '3' THEN DATEADD(MONTH, 3, rs.Last_Payment)     
           WHEN '4' THEN DATEADD(MONTH, 1, rs.Last_Payment)
        END AS [Next Payment Due],
        rs.[Actual Date in],
        @DueDate,
        DATEDIFF(MONTH, @DueDate, GETDATE()) * rsp.Price_Month AS [Amount to be paid],
        rs.Balance
    FROM
        [dbo].[Reservation_Price] rsp
    INNER JOIN
        [dbo].[Reservations] rs ON rsp.Reservation_ID = rs.ID
    INNER JOIN
        [dbo].[Person] prs ON rs.[Person ID] = prs.ID
    INNER JOIN
        [dbo].[Channel] c ON rs.[Channel ID] = c.ID
    INNER JOIN
        [dbo].[Reservation_Frequency] fq ON rsp.Frequency = fq.ID
    WHERE
        rsp.Date_From < GETDATE() 
        AND rsp.Date_To > DATEADD(MONTH, 1, rs.Last_Payment)
END

1 Ответ

0 голосов
/ 08 октября 2018

Ошибка в том, что вы определили @DueDate в качестве даты и времени, а затем пытаетесь присвоить значение большому оператору выбора.Это не так, как это работает.Просто вставьте это выражение в ваш запрос.Не совсем уверен, почему вы передаете @DueDate, потому что вы установили его в своем коде.Вот как это должно выглядеть.

ALTER PROCEDURE [dbo].[GetPayments] 
 @DueDate AS DATETIME

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    select prs.[First Name] + ' '+prs.[Middle Name]+' '+prs.[Last Name] as [Tenant],c.Name as [Channel Name]
        , CASE rsp.[Frequency] when '1' then DATEADD(MONTH, 12, rs.Last_Payment)
                                             when '2' then DATEADD(MONTH, 6, rs.Last_Payment)
                                             when '3' then DATEADD(MONTH, 3, rs.Last_Payment)       
                                             when '4' then DATEADD(MONTH, 1, rs.Last_Payment)
                                             end as [Next Payment Due]
        , rs.[Actual Date in]
        , DueDate = CASE rsp.[Frequency] --Frequency really a string? Seems like it should be an int
                when '1' then DATEADD(MONTH, 12, rs.Last_Payment) --casting the result of DATEADD to a datetime is redundant. It returns a datetime
                when '2' then DATEADD(MONTH, 6, rs.Last_Payment)
                when '3' then DATEADD(MONTH, 3, rs.Last_Payment)
                when '4' then DATEADD(MONTH, 1, rs.Last_Payment)
                end
        , DATEDIFF(MONTH,@DueDate,GETDATE())*rsp.Price_Month as [Amount to be paid]
        , rs.Balance
    from [dbo].[Reservation_Price] rsp
    inner join [dbo].[Reservations] rs on rsp.Reservation_ID = rs.ID
    inner join [dbo].[Person] prs on rs.[Person ID] = prs.ID
    inner join [dbo].[Channel] c on rs.[Channel ID] = c.ID
    inner join [dbo].[Reservation_Frequency] fq on rsp.Frequency = fq.ID
    where rsp.Date_From<GETDATE() and rsp.Date_To > DATEADD(MONTH, 1, rs.Last_Payment)

END
...