Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 将SQL server datetime字段转换为仅比较具有索引查找的日期部分_Sql Server 2005_Datetime - Fatal编程技术网

Sql server 2005 将SQL server datetime字段转换为仅比较具有索引查找的日期部分

Sql server 2005 将SQL server datetime字段转换为仅比较具有索引查找的日期部分,sql-server-2005,datetime,Sql Server 2005,Datetime,我一直在对SQL server中“中间”查询中使用的每个日期字段执行转换(varchar,datefield,112),以确保我只考虑日期,而不遗漏任何基于日期时间字段时间部分的日期 现在,我听说转换是不可索引的,在SQLServer2005中,有更好的方法来比较查询中日期时间的日期部分,以确定日期是否在某个范围内 这样做的最佳、可转位的方法是什么: select * from appointments where appointmentDate>='08-01-2008' and app

我一直在对SQL server中“中间”查询中使用的每个日期字段执行
转换(varchar,datefield,112)
,以确保我只考虑日期,而不遗漏任何基于日期时间字段时间部分的日期

现在,我听说转换是不可索引的,在SQLServer2005中,有更好的方法来比较查询中日期时间的日期部分,以确定日期是否在某个范围内

这样做的最佳、可转位的方法是什么:

select * from appointments
where appointmentDate>='08-01-2008' and appointmentDate<'08-15-2008'
从约会中选择*

其中appointmentDate>='08-01-2008'和appointmentDate正确-执行转换将对查询的每一行执行转换。最好将日期列保留为日期,并将where子句作为日期传入:

select * from appointments where appointmentdate between 
'08/01/2008' AND '08/16/2008'

注意:省略时间意味着午夜(00:00.000),因此您将包括08/01的所有时间,以及08/15之后的所有时间,以及任何正好是08/16/2008 00:00:00的时间。删除datetime字段时间部分的最佳方法是使用datediff和dateadd函数

   DateAdd(day, datediff(day,0, MydateValue), 0)
这充分利用了SQL Server将日期存储为两个整数的事实,一个表示自“0”(1900年1月1日)起的天数,另一个表示自午夜(当时)*起的节拍数(每个节拍约为3.33毫秒)

上面的公式只需读取第一个整数。不需要转换或处理,因此速度非常快

要使查询使用索引。。。首先在输入筛选参数上使用此公式,或者在表日期时间字段等号的“其他”一侧使用此公式,这样查询优化器就不必在表中的每个日期时间字段上运行计算来确定哪些行满足筛选谓词。这使您的搜索参数“SARG-able”(搜索参数)

而不是

Where DateAdd(day, datediff(day,0, 
      MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able
*注意。在内部,第二个整数(时间部分)存储刻度。一天中有24 x 60 x 60 x 300=25920000个滴答声(碰巧刚好低于32位整数可以容纳的最大值)。然而,在算术上修改日期时间时,您不需要担心这个问题。。。当从日期时间中添加或减去值时,可以将该值视为一个分数,就像它完全等于一天的小数部分一样,就像完整的日期时间值是一个浮点数,由表示日期的整数部分和表示时间的小数部分组成)。i、 e

`Declare @Dt DateTime  Set @Dt = getdate()  
 Set @Dt = @Dt + 1.0/24  -- Adds one hour  
 Select @Dt  
 Set @Dt = @Dt - .25 -- Moves back 6 hours  
 Select @Dt`

让计算的持久列计算所需的表达式。如果列被计算并持久化,它们也可以被编入索引。

将数字类型转换为字符串值(一种装箱类型)并不是实现所需操作的最佳方法。这实际上与索引无关,因为实际的列类型是date-time

如果您正在寻找查询日期的最佳方式,那么您的示例是正确的,但是您可能需要考虑MSSQL中的3毫秒精度差异。这可能意味着一天的记录可以在另一天的结果中显示出来

这个


从任命日期>='08-01-2008'和任命日期='08-01-2008'以及任命日期的任命中选择*,也可以使用


太棒了!这为我节省了大量的工作、处理时间和理智。如果有“推荐新的公认答案”,我会选择这个。干得好!最后一点不是好的建议。使用=和<仍然可以处理这些更改中的任何一个。如果不包括它,您很容易成为精度不足的受害者。DateTime2和date在SQL 2005中不适用=
`Declare @Dt DateTime  Set @Dt = getdate()  
 Set @Dt = @Dt + 1.0/24  -- Adds one hour  
 Select @Dt  
 Set @Dt = @Dt - .25 -- Moves back 6 hours  
 Select @Dt`
select * from appointments where appointmentDate>='08-01-2008' and appointmentDate<'08-15-2008'
select * from appointments where appointmentDate>='08-01-2008' and appointmentDate<='08-14-2008 23:59:59.996'
SELECT CAST(FLOOR(CAST( getdate() AS float )) AS datetime)