【问题标题】:Ignoring the time element of a datetime field忽略日期时间字段的时间元素
【发布时间】:2009-12-21 16:45:19
【问题描述】:

我的表中有一个日期时间字段。我想根据日期删除记录,但我对时间元素不感兴趣。我将如何为此编写 SQL?我正在使用 MS SQL 2008。

【问题讨论】:

    标签: sql-server datetime


    【解决方案1】:

    为了更好地使用索引,我会选择这种方法:

    删除 12 月 1 日的所有记录:

    DECLARE @DateToDelete DATETIME
    SET @DateToDelete = '20091201' 
    
    DELETE FROM MyTable
    WHERE MyDateField >= @DateToDelete AND MyDateField < DATEADD(dd, 1, @DateToDelete)
    

    替代方案包括:

    DELETE FROM MyTable
    WHERE CAST(CONVERT(VARCHAR(10), MyDateField, 120) AS DATETIME) = @DateToDelete
    

    将每个日期时间值转换为其日期部分。

    但我仍然会使用我原来的方式,因为它可以更有效地执行。

    【讨论】:

    • 您不会也使用这种方法删除 20091202 00:00:00 的记录吗?
    • 不,因为我在做
    • “替代”是不可分割的,不会使用 dat 字段上的现有索引。
    • +1 - 通过“忽略时间元素”,您在这种情况下实际上的意思是所有日期时间之间的时间。 2009 年 12 月 1 日 00:00 和 2009 年 12 月 1 日 23:59,因此有界约束绝对是最清晰、最有效的方法。
    【解决方案2】:

    如果您使用 MS SQL 2008,那么您可以转换为新的 DATE 类型

    DELETE FROM table WHERE date_filed >= CONVERT(DATE,GETDATE())
    

    【讨论】:

      【解决方案3】:

      时间在其他任何地方是否相关?如果不是,那么您应该改用 DATE 列。如果不能,那么在 WHERE 子句中查找日期时间的日期部分的最佳方法是使用范围:

      ... WHERE dateColumn BETWEEN '20091221' and '20091222';
      

      请注意,鉴于 3 毫秒的日期时间精度,20091221 23:59:59.999 之类的日期时间可能会近似于 20091222 00:00:00.000,这有时会产生问题。

      T-SQL Tuesday #001 (Date/Time Tricks): The Roundup 上有大量关于日期时间主题的博客文章

      【讨论】:

      • 仅当 OP 在 SQL Server 2008 上时才适用使用 DATE 列的建议。2008 年之前的 SQL Server 只有 datetime 和 smalldatetime。此外,给定的 between 子句将匹配时间 00:00:00.000 的任何记录。
      • OP 明确指出它在 SQL 2008 上
      • @Remus:你是对的。我错过了。我只是在看标签。
      【解决方案4】:

      试试这个:-

      declare @date datetime 
      set @date = '2006-11-09'
      select @date, dateadd(ms, -1, DATEADD(dd,1,@date))
      delete from login 
      where datecreated between @date AND dateadd(ms, -1, DATEADD(dd,1,@date))
      

      【讨论】:

        【解决方案5】:

        这就是datediff 的用途:

        delete from Table where datediff(day,'2009-12-09',date_filled) = 0
        

        【讨论】:

          猜你喜欢
          • 2017-12-07
          • 2018-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多