仅与SQL Server中的系统日期进行日期部分比较

时间:2012-06-26 11:40:01

标签: sql-server tsql

我有一个存储过程: -

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是包含日期为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 个答案:

答案 0 :(得分:2)

在SQL2K8中;

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

(这将取消CalendarDate上的任何索引使用,或CalendarDate之间的括号CalendarDate >= CAST(CalendarDate AS DATE) AND < DATEADD(...

答案 1 :(得分: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);

因为此转换不适用于其他日期/时间数据类型,为了保持一致性,我更喜欢开放式范围技术,并且绝对不会宽恕在列上执行隐式或显式转换的大多数情况(因为这通常意味着不会使用索引)。我在以下博客文章中大肆宣传这个以及其他几个日期/时间暴行:

答案 2 :(得分: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 )

答案 3 :(得分:0)

使用convert function

在你的情况下:

SELECT CONVERT(DATE,GETDATE(),101)

更具体地说:

(SELECT MAX(ProductionTimeEntryID)             
            FROM production            
            where UserID=@userID 
            and (CONVERT(DATE,CalendarDate) = CONVERT(DATE,GETDATE()))            
            and IsTaskCompleted=1 )
相关问题