【发布时间】:2009-12-21 16:45:19
【问题描述】:
我的表中有一个日期时间字段。我想根据日期删除记录,但我对时间元素不感兴趣。我将如何为此编写 SQL?我正在使用 MS SQL 2008。
【问题讨论】:
标签: sql-server datetime
我的表中有一个日期时间字段。我想根据日期删除记录,但我对时间元素不感兴趣。我将如何为此编写 SQL?我正在使用 MS SQL 2008。
【问题讨论】:
标签: sql-server datetime
为了更好地使用索引,我会选择这种方法:
删除 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
将每个日期时间值转换为其日期部分。
但我仍然会使用我原来的方式,因为它可以更有效地执行。
【讨论】:
如果您使用 MS SQL 2008,那么您可以转换为新的 DATE 类型
DELETE FROM table WHERE date_filed >= CONVERT(DATE,GETDATE())
【讨论】:
时间在其他任何地方是否相关?如果不是,那么您应该改用 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 上有大量关于日期时间主题的博客文章
【讨论】:
试试这个:-
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))
【讨论】:
这就是datediff 的用途:
delete from Table where datediff(day,'2009-12-09',date_filled) = 0
【讨论】: