SQL SERVER, передающий getdate () или строковую дату, работает неправильно - PullRequest
0 голосов
/ 29 марта 2011
CREATE PROCEDURE sp_ME

@ID int, 
@ThisDate datetime = null

AS
SET NOCOUNT ON


IF @ThisDate IS NULL
BEGIN
    SET @ThisDate = CURRENT_TIMESTAMP
END

DECLARE @intErrorCode int,  
        @QBegin datetime, 
        @QEnd datetime

SELECT @intErrorCode = @@ERROR


IF @ThisDate BETWEEN '01/01/' + CONVERT(VARCHAR(4), YEAR(@ThisDate))  
             AND '03/31/' + CONVERT(VARCHAR(4), YEAR(@ThisDate))  

BEGIN
    Select @QBegin  = DATEADD(s,0,CAST ('10/01/'  AS varchar(6) ) + 
                      CONVERT(VARCHAR(4),DATEPART (year,@ThisDate)-1))

    Select @QEnd = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@QBegin)+3,0))


    SELECT * FROM   QUERY 
    WHERE       MEID = @ID 
    AND         mydate >= @QBegin 
    AND         mydate <= @QEnd)
END

SELECT @intErrorCode = @@ERROR
IF (@intErrorCode <> 0) GOTO ErrHandler

ErrHandler:
        RETURN @intErrorCode
GO

Возвращает набор данных, когда вы оставляете его пустым, и он принимает и заполняет дату, однако, когда вы вставляете дату, она просто заявляет: «Команда успешно выполнена».

Любая помощь будетбыть более чем оцененным.

1 Ответ

1 голос
/ 29 марта 2011

В предположении, вам нужно запросить результаты предыдущего квартала, который будет просто таким запросом:

SELECT * FROM   QUERY 
    WHERE       MEID = @ID 
    AND         mydate >= DATEADD(quarter,DATEDIFF(quarter,'20010101',@ThisDate),'20001001'),
    AND         mydate <  DATEADD(quarter,DATEDIFF(quarter,'20010101',@ThisDate),'20010101'))

И избавиться от этого большого условия if и т. Д.

Выможет также избавиться от первого, если, если вы положите COALESCE(@ThisDate,CURRENT_TIMESTAMP) в вышеупомянутом, где у меня в настоящее время есть @ThisDate.

, я использую шаблон DATEADD(quarter,DATEDIFF(quarter,'20010101',@ThisDate),'20001001') для большого количества манипуляций с датой и временем.Это позволит вам многого добиться за несколько операций.В этом случае это разница между двумя датами ('20010101','20001001'), которая дает нам предыдущий квартал.


Вы часто встречаете шаблон DATEADD / DATEDIFF в вопросах, касающихся удаления части временииз значения даты и времени.Каноническая версия этого DATEADD(day,DATEDIFF(day,0,@Date),0).Но шаблон может быть в целом расширен для работы с любым из компонентов datetime.Если вы выберете month вместо day, вы получите полночь в начале первого числа месяца (того дня, когда вы указали)

Сложность возникает при использовании дат(вместо 0), особенно если вы не используете одну и ту же дату для обоих расчетов.Это позволяет вам применять дополнительное смещение, которое кажется почти «свободным» - вы уже используете эту конструкцию для удаления компонента времени, тот факт, что вы можете вычислить, например, последнюю дату в квартале / месяце / и т. Д., Является бонусом.

...