在SQL Server中,我有一个DATETIME
包含时间元素的列.
例:
'14 AUG 2008 14:23:019'
仅选择特定日期的记录,忽略时间部分的最佳方法是什么?
示例:(不安全,因为它与时间部分不匹配并且不返回任何行)
DECLARE @p_date DATETIME SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 ) SELECT * FROM table1 WHERE column_datetime = @p_date
注意:鉴于这个网站也是关于记下你选择的笔记和技术,然后忘记,我将发布我自己的答案,因为MSSQL中的DATETIME东西可能是我在SQLBOL中查找最多的主题.
更新 Clarified示例更具体.
编辑抱歉,但我不得不降低错误的答案(答案返回错误的结果).
@Jorrit:WHERE (date>'20080813' AND date<'20080815')
将返回13日和14日.
@wearejimbo:关闭,但没有雪茄!徽章授予你.您错过了在2008年8月14日23:59:001到23:59:999(即午夜前不到1秒)写下的记录.
技巧1:
DECLARE @p_date DATETIME SET @p_date = CONVERT( DATETIME, '14 AUG 2008', 106 ) SELECT * FROM table1 WHERE column_datetime >= @p_date AND column_datetime < DATEADD(d, 1, @p_date)
这样做的好处是,如果它存在,它将使用'column_datetime'上的任何索引.
在SQL Server 2008中,您可以使用新的DATE数据类型
DECLARE @pDate DATE='2008-08-14' SELECT colA, colB FROM table1 WHERE convert(date, colDateTime) = @pDate
@Guy.我想你会发现这个解决方案可以很好地扩展.查看原始查询的查询执行计划.
而对于我的:
只需比较年,月,日值.
Declare @DateToSearch DateTime Set @DateToSearch = '14 AUG 2008' SELECT * FROM table1 WHERE Year(column_datetime) = Year(@DateToSearch) AND Month(column_datetime) = Month(@DateToSearch) AND Day(column_datetime) = Day(@DateToSearch)