【问题标题】:sqlserver date arithmetic problemsql server 日期算术题
【发布时间】:2009-03-03 11:40:28
【问题描述】:

我有一个日历控件的事件记录,其中包含开始时间和结束时间。

我想在特定日期完成活动,比如 2009 年 2 月 28 日

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

我在 VS 2005 IDE 中创建的存储过程中尝试了这个查询,但没有成功

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

提前致谢。

【问题讨论】:

  • 只有 datetime 和 smalldatetime 数据类型与日期相关。使用它们或使用 event_date 作为 varchar。
  • 关于数据类型错误。如果您使用的是 SQLServer2005 或更早版本,则需要将日期更改为日期时间

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


【解决方案1】:

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

为了获得最佳性能解决方案检查: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】:

    根据您更新的问题,这应该可行:

       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
    

    【讨论】:

    • 更清晰,但您会选择第二天午夜的任何开始时间(“介于”包括在内)。我认为你需要 >= 和
    • @All,我有一个新问题,日期未被识别为有效数据类型。
    【解决方案3】:

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

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

    这里要指出的关键点是,为了捕获在给定日期发生的所有记录,您需要定义一个包含当天所有时间值的日期范围。

    有意义吗?

    干杯,约翰

    【讨论】:

    • 顺便说一句:刚刚注意到如果有 30 天,这确实是一个很棒的 2 月 :)
    • 用这个方法,你显然不能只在日期的day部分加上一天:)
    • @Learning:仅为您更新 Tipex ;-)
    • @Learning:我的代码非常高效,实际上可以弯曲时间和空间。
    • 约翰:哈!我怀疑……我所指出的只是那个时空连续体中的一个瞬间。对不起。 :)
    【解决方案4】:
    --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
    

    【讨论】:

    • 将日期(数字)转换为 char 比仅保留数字要慢得多。
    • 它只转换一次,几乎不是 CPU 杀手!
    猜你喜欢
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多