使用当前日期作为默认值

时间:2016-09-14 18:09:46

标签: sql-server sql-server-2008-r2

我正在处理一个带有3个输入参数的存储过程。第一个是必需的,但另外两个是日期,不是必需的。我希望日期参数默认为当天。以下是我到目前为止的情况:

USE [MyDB]
GO

/****** Object:  StoredProcedure [dbo].[p_qIMO_TEST_2]

Example: exec [dbo].[p_qIMO_TEST_2] 'DS5264000001','20090101','20100101'

*/

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND OBJECT_ID = OBJECT_ID('qIMO_TEST_2'))
     exec('CREATE PROCEDURE [dbo].[qIMO_TEST_2] AS BEGIN SET NOCOUNT ON; END')
GO

alter PROCEDURE [dbo].[p_qIMO_TEST_2] 
     @i_InstrumentID VARCHAR(15) = NULL,
     @i_DateLow      VARCHAR(15) = '20090101',  
     @i_DateHigh     VARCHAR(15) = '20291231'   
AS
IF @i_InstrumentID IS NULL
BEGIN
    PRINT 'Error: You must specify a valid Instrument ID'
    RETURN
END
     SELECT * FROM
     (
            SELECT 
                 out_interface_id,
                 msg_id, 
                 CAST(xml_msg as XML).value(
                    '(//InstrumentID)[1]','nvarchar(MAX)') AS InstrumentID,
                 msg_type,
                 xml_msg,
                 CAST(xml_msg AS XML) as [Quick_XML], 
                 date_received,
                 status,
                 last_modified,
                 environment,
                 transaction_closed_date
            FROM MyTable
            WHERE msg_type IN ('ABC','DEF') 
            AND date_received >= @i_DateLow
            AND date_received < DATEADD(DAY,1,@i_DateHigh)  -- Need to add 1 to the DateHigh for 
                                                                                                        -- date range criteria to work properly (>= and <)
     ) x
     WHERE (x.InstrumentID = @i_InstrumentID OR x.InstrumentID = NULL)
     ORDER BY date_received DESC
RETURN
GO

现在,我只是使用任意范围的日期,但返回结果需要很长时间。寻找任何人都可以提供的建议。我正在使用MS SQL server 2008 r2。

1 个答案:

答案 0 :(得分:1)

如注释所示,请检查您的数据类型,如果必须,请仅使用VARCHAR。

编辑datetime,我们将getdate()转换为日期类型以删除时间值,然后返回日期时间类型。

alter PROCEDURE [dbo].[p_qIMO_TEST_2] 
     @i_InstrumentID VARCHAR(15) = NULL,
     @i_DateLow      DATETIME = NULL,  
     @i_DateHigh     DATETIME = NULL   
AS

    IF @i_DateLow IS NULL SET @i_DateLow = CONVERT(DATETIME,CONVERT(DATE,GETDATE()))
    IF @i_DateHigh IS NULL SET @i_DateHigh = CONVERT(DATETIME,CONVERT(DATE,GETDATE()))