我有一个存储过程: -
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 )
请指导我做什么修改以获得结果。
答案 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)
在你的情况下:
SELECT CONVERT(DATE,GETDATE(),101)
更具体地说:
(SELECT MAX(ProductionTimeEntryID)
FROM production
where UserID=@userID
and (CONVERT(DATE,CalendarDate) = CONVERT(DATE,GETDATE()))
and IsTaskCompleted=1 )