0

私はストアドプロシージャを持っています:-

CREATE procedure St_Proc_GetTimeEntryID            
@userID int,            
@timeEntryID int output            
as begin             
    set nocount on;      
    SET @timeEntryID=0      
    DECLARE @TEMP INT       
    SET @TEMP=0        
    SELECT @TEMP=ProductionTimeEntryID            
    FROM    production            
    WHERE   ProductionTimeEntryID =             
        (SELECT MAX(ProductionTimeEntryID)             
            FROM production            
            where UserID=@userID             
            and (CalendarDate = (select GETDATE()))            
            and IsTaskCompleted=1 )      
            BEGIN      
                SET @timeEntryID=@TEMP      
            END      
END

ここで、CalendarDate は Date As 06/26/201212:00PM format を含む列です。サブクエリで日付部分のみをシステム日付部分 (06/26/2012 = 06/26/2012) と比較したい

(SELECT MAX(ProductionTimeEntryID)             
            FROM production            
            where UserID=@userID 
            and (CalendarDate = (select GETDATE()))            
            and IsTaskCompleted=1 )

結果を得るためにどのような変更を行うか教えてください。

4

4 に答える 4

2

SQL2K8 では。

 ... WHERE CAST(CalendarDate AS DATE) <= CAST(GETDATE() AS DATE)

(これにより、 でのインデックスの使用が無効になり、代わりに の間CalendarDateで括弧が付けられます)CalendarDateCalendarDate >= CAST(CalendarDate AS DATE) AND < DATEADD(...

于 2012-06-26T11:50:30.107 に答える
1

CalendarDateSQL Server 2000/2005 では、最も効率的な方法 (インデックスが存在する場合は、そのインデックスを完全に利用できることを意味します) は次のようになります。

DECLARE @today SMALLDATETIME;
SET @today = DATEDIFF(DAY, 0, CURRENT_TIMESTAMP);

...
WHERE CalendarDate >= @today
AND CalendarDate < DATEADD(DAY, 1, @today);

SQL Server 2008 以降を使用している場合:

DECLARE @today DATE = CURRENT_TIMESTAMP;
...
WHERE CalendarDate >= @today
AND CalendarDate < DATEADD(DAY, 1, @today);

CalendarDateSQL Server 2008 以降で直接キャストを使用することもできますが、これがすべてのシナリオでインデックスを使用することが保証されているとは 100% 確信が持てません。

WHERE CONVERT(DATE, CalendarDate) = CONVERT(DATE, CURRENT_TIMESTAMP);

このキャストは他の日付/時刻データ型では機能しないため、一貫性を保つために、私は無制限の範囲手法を好みます。インデックスは使用されません)。私は、次のブログ投稿で、これと他のいくつかの日付/時刻の残虐行為について怒鳴りつけました。

于 2012-06-26T12:25:29.020 に答える
0

このようなもの?

(SELECT MAX(ProductionTimeEntryID)             
        FROM production            
        where UserID=412             
        and (convert(datetime, convert(varchar(100), CalendarDate, 106)) <= convert(datetime, convert(varchar(100), GETDATE(), 106)))            
        and IsTaskCompleted=1 )
于 2012-06-26T11:48:28.140 に答える
0

変換機能を使う

あなたの場合:

SELECT CONVERT(DATE,GETDATE(),101)

すなわち:

(SELECT MAX(ProductionTimeEntryID)             
            FROM production            
            where UserID=@userID 
            and (CONVERT(DATE,CalendarDate) = CONVERT(DATE,GETDATE()))            
            and IsTaskCompleted=1 )
于 2012-06-26T11:50:20.723 に答える