代码之家  ›  专栏  ›  技术社区  ›  Moo

具有日期范围的T-SQL查询

  •  3
  • Moo  · 技术社区  · 14 年前

    我有一个相当奇怪的“bug”,它带有一个简单的查询,我模糊地记得在很久以前的某个地方读到了它的原因,但我希望有人能刷新我的记忆。

    该表是一个基本ID,日期时间表。

    查询是:

    select ID, Datetime from Table where Datetime <= '2010-03-31 23:59:59'
    

    问题是,查询结果包括日期时间为“2010-04-01 00:00:00”的结果。第二天。这是不应该的。

    有人吗?

    干杯

    3 回复  |  直到 14 年前
        1
  •  7
  •   SQLMenace    14 年前

    看一看 How Are Dates Stored In SQL Server? How Does Between Work With Dates In SQL Server?

    如果是smalldatetime,则精度为1分钟,因此如果向上取整,则datetime的精度为300毫秒。

    例子

    DECLARE @d DATETIME
    SELECT @d = '2001-12-31 23:59:59.999'
    
    SELECT @d
    

    2002年1月1日00:00:00.000

    DECLARE @d DATETIME
    SELECT @d = '2001-12-31 23:59:59.998'
    
    SELECT @d
    

    2001年12月31日23:59:59.997

    在你的情况下,总是在午夜使用少于第二天的时间

    < '20100401'
    
        2
  •  3
  •   Marcelo Cantos    14 年前

    你看到这很奇怪,我不知道为什么。但我建议您改为使用以下方式编写查询:

    select ID, Datetime from Table where Datetime < '2010-04-01'
    
        3
  •  3
  •   KM.    14 年前

    尝试这样做:

    select ID, Datetime from Table where Datetime < '2010-04-01'
    

    我总是设置日期时间,并增加日期,只使用“<”小于。

    要将日期时间设置为仅限当天使用,请执行以下操作:

    SELECT DATEADD(day,DATEDIFF(day,0,  GETDATE()   ),0) 
    

    您可以使用加法轻松地增加日期时间:

    SELECT GETDATE()+1
    

    通过使用“23:59:59”,您可以忽略行,尝试一下:

    DECLARE @YourTable table (RowID int, DateOf datetime)
    INSERT INTO @YourTable VALUES (1,'2010-03-31 10:00')
    INSERT INTO @YourTable VALUES (2,'2010-03-31')
    INSERT INTO @YourTable VALUES (3,'2010-03-31 23:59:59')
    INSERT INTO @YourTable VALUES (4,'2010-03-31 23:59:59.887')
    INSERT INTO @YourTable VALUES (5,'2010-04-01')
    INSERT INTO @YourTable VALUES (6,'2010-04-01 10:00')
    select * from @YourTable where DateOf <= '2010-03-31 23:59:59'
    

    产量

    RowID       DateOf
    ----------- -----------------------
    1           2010-03-31 10:00:00.000
    2           2010-03-31 00:00:00.000
    3           2010-03-31 23:59:59.000
    
    (3 row(s) affected
    

    这个查询是错误的,因为它找不到丢失的rowid=4记录。

    如果您尝试用以下方法解决此问题:

    select * from @YourTable where DateOf <= '2010-03-31 23:59:59.999'
    

    那么rowid=5也将包含在内,这是错误的。