Как я могу применить преобразование в моей хранимой процедуре - PullRequest
1 голос
/ 24 июня 2019

Я видел, что это решено здесь в другое время, однако я не уверен, как применить это преобразование в этом случае. Пожалуйста, смотрите сообщения об ошибках и код ниже:

Преобразование типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона

Ошибка преобразования при преобразовании даты и / или времени из символьной строки.

Код:

ALTER PROCEDURE SP_Loans_to_Date 
    @ReportDate DATETIME   
AS
BEGIN
    DECLARE @DayofWeek VARCHAR(100),
            @BeginofWeek DATE,
            @BeginofMonth DATE,
            @BeginofYear DATE

    SET @DayofWeek = DATENAME(DW, @ReportDate)
    SET @BeginofWeek = (SELECT 
                            CASE 
                               WHEN @DayofWeek = 'Sunday' 
                                  THEN DATEADD(DD, 0, @ReportDate)
                               WHEN @DayofWeek = 'Monday' 
                                  THEN DATEADD(DD, -1, @ReportDate)
                               WHEN @DayofWeek = 'Tuesday' 
                                  THEN DATEADD(DD, -2, @ReportDate)
                               WHEN @DayofWeek = 'Wednesday' 
                                  THEN DATEADD(DD, -3, @ReportDate)
                               WHEN @DayofWeek = 'Thursday' 
                                  THEN DATEADD(DD, -4, @ReportDate)
                               WHEN @DayofWeek = 'Friday' 
                                  THEN DATEADD(DD, -5, @ReportDate)
                               WHEN @DayofWeek = 'Saturday' 
                                  THEN DATEADD(DD, -6, @ReportDate) 
                            END BeginofWeek)
    SET @BeginofMonth = (SELECT 
CONVERT(DATETIME, CONVERT(VARCHAR(100), DATEPART(MM, @ReportDate)) + '1'+ 
CONVERT(VARCHAR(100), DATEPART(YY, @ReportDate))))
    SET @BeginofYear =  (SELECT ('1/1' + 
                                CONVERT(VARCHAR(100), DATEPART(YY, @ReportDate))))

    SELECT 
        SSN, LoanDate,
        CASE
           WHEN LoanDate >= @BeginofWeek AND LoanDate <= @ReportDate 
              THEN 'WeektoDate'
           WHEN LoanDate >= @BeginofWeek AND LoanDate <= @ReportDate 
              THEN 'MonthtoDate'
           WHEN LoanDate >= @BeginofWeek AND LoanDate <= @ReportDate 
              THEN 'YeartoDate' 
           ELSE NULL 
        END ToDate,
        CASE
           WHEN LoanDate >= @BeginofWeek AND  LoanDate <= @ReportDate 
              THEN 1
           WHEN LoanDate >= @BeginofWeek AND  LoanDate <= @ReportDate 
              THEN 2
           WHEN LoanDate >= @BeginofWeek AND  LoanDate <= @ReportDate 
              THEN 3 
           ELSE NULL 
        END ToDateOrder
    FROM
        [dbo].[Dim_Loan];

END

1 Ответ

0 голосов
/ 24 июня 2019

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

DECLARE @DayofWeek INT,
        @BeginofWeek DATE,
        @BeginofMonth DATE,
        @BeginofYear DATE

SET @DayofWeek = DATEPART(DW, @ReportDate)
SET @BeginofWeek = DATEADD(DAY, 1 - @DayofWeek, @ReportDate)
SET @BeginofMonth = DATEFROMPARTS(YEAR(@ReportDate), MONTH(@ReportDate), 1)
SET @BeginofYear = DATEFROMPARTS(YEAR(@ReportDate), 1, 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...