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 格式的列。我想在我的子查询中仅将日期部分与系统日期部分(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,或者括号CalendarDate之间CalendarDate >= CAST(CalendarDate AS DATE) AND < DATEADD(...

于 2012-06-26T11:50:30.107 回答
1

在 SQL Server 2000/2005 上,最有效的方法(意味着完全能够利用 上的索引CalendarDate,如果存在的话)将是:

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);

您还可以在 SQL Server 2008+ 中使用直接强制转换,但我不能 100% 确定这可以保证CalendarDate在所有情况下都使用索引:

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 回答