SQL SERVER传递getdate()或字符串日期无法正常工作

时间:2011-03-29 14:26:08

标签: tsql stored-procedures sql-server-2000

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 个答案:

答案 0 :(得分:1)

猜测一下,您需要查询上一季度的结果,这只是这个查询:

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

摆脱那个大的条件等等。

如果您将COALESCE(@ThisDate,CURRENT_TIMESTAMP)放在上面我目前拥有@ThisDate的位置,您也可以摆脱第一个。

我使用DATEADD(quarter,DATEDIFF(quarter,'20010101',@ThisDate),'20001001')模式进行大量的日期时间操作。它让你在一些操作中取得了很多成就。在这种情况下,它是给我们上一季度的两个日期('20010101','20001001')之间的差异。


在涉及从日期时间值中删除时间部分的问题中,您经常会遇到DATEADD / DATEDIFF模式。规范版本是DATEADD(day,DATEDIFF(day,0,@Date),0)。但是该模式通常可以扩展为与任何日期时间组件一起使用。如果您选择month而不是day,那么您将在该月的第一天(您提供的那一天)开始时午夜

当你使用日期(而不是0)时,它变得棘手,特别是如果你不使用相同的日期进行两次计算。这允许你应用一个似乎几乎“免费”的额外偏移 - 你已经使用这个结构来删除时间组件,你可以计算例如一个季度/月/等的最后一个日期是奖金。