sqlserver日期算术问题

时间:2009-03-03 11:40:29

标签: sql sql-server sql-server-2005 tsql stored-procedures

我有一个日历控件的starttime和endtime事件记录。

我希望在特定日期完成事件,比如2009年2月28日

但db表的日期数据格式为2/28/2009 10:00:00,2 / 28/2009 12:00:00。

我在VS 2005 IDE中创建的sproc中尝试了此查询,但它无法正常工作

ALTER PROCEDURE dbo.spSelectBenchEvent
(   
@EVENT_DATE DATE // BTW, THIS RETURNS ERROR :CANNOT FIND DATE DATATYPE.
                 //@EVENT_DATE HAS INVALID DATATYPE 
)
AS
BEGIN TRAN
SET NOCOUNT ON;

SELECT     ID, EID, BENCHID, PACCODE, START_TIME, END_TIME
    FROM         tbl_benchbook
    WHERE START_TIME=EVENT_DATE
    ORDER BY START_TIME

提前致谢。

4 个答案:

答案 0 :(得分:2)

如果您希望评估2009年3月29日的所有活动,请使用以下cluase。

SELECT *
FROM tableName
WHERE Date >= '2009/03/29' AND  Date < '2009/03/30' 

此处要点的关键是,为了捕获在给定日期发生的所有记录,您需要定义包含该日所有时间值的日期范围。

有意义吗?

干杯,约翰

答案 1 :(得分:2)

有很多与此相关的问题,请查看:

并提供最佳性能解决方案检查:MS SQL Date Only Without Time

基本上您的代码可能如下所示:

select     
    id, eid, benchid, paccode, start_time, end_time
from  
    tbl_benchbook
where start_time >= dateadd(dd, datediff(dd, 0, @event_date), 0)
and start_time < dateadd(dd, datediff(dd, 0, @event_date)+1, 0)

答案 2 :(得分:2)

根据您更新的问题,这应该有效:

   SELECT  ID, EID, BENCHID, PACCODE, START_TIME, END_TIME
   FROM    tbl_benchbook
   WHERE   START_TIME >= @EVENT_DATE 
   AND     START_TIME < DATEADD(day,1,@EVENT_DATE)
   ORDER BY START_TIME

答案 3 :(得分:-1)

--1. you need to make sure there is no time on the parameter
--2. you can just use "+1" on the datetime, to get the next day



    enter ALTER PROCEDURE dbo.spSelectBenchEvent
    (   
    @EVENT_DATE DATETIME 
    )
    AS
    BEGIN TRAN
    SET NOCOUNT ON;

    --remove any time from given date
    SET @EVENT_DATE=CONVERT(char(10),@EVENT_DATE,111)


    SELECT     ID, EID, BENCHID, PACCODE, START_TIME, END_TIME
            FROM         tbl_benchbook
            WHERE START_TIME>=@EVENT_DATE AND START_TIME<@EVENT_DATE+1
            ORDER BY START_TIME
    code here