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
当您将数据集留空并且它假定并填写日期时,它会返回一个数据集,但是当您插入日期时,它只会声明“命令已成功完成。”
任何帮助都不仅仅是值得赞赏的。
答案 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
)时,它变得棘手,特别是如果你不使用相同的日期进行两次计算。这允许你应用一个似乎几乎“免费”的额外偏移 - 你已经使用这个结构来删除时间组件,你可以计算例如一个季度/月/等的最后一个日期是奖金。