Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 我的查询中的日期处理有什么区别?_Sql Server - Fatal编程技术网

Sql server 我的查询中的日期处理有什么区别?

Sql server 我的查询中的日期处理有什么区别?,sql-server,Sql Server,我需要上个月的记录数。到目前为止,我一直使用这种方法: select count(ID) from table where col1 = 'somerule' and DateTimeOfInsert >= '20150901' and DateTimeOfInsert <= '20150930' 我唯一的问题是此时第一个查询返回1073,第二个查询返回1124。所以问题很明显:它们之间有什么区别?两者都应包括开始日期和结束日期。我看不出来。区别在于dateti

我需要上个月的记录数。到目前为止,我一直使用这种方法:

select 
 count(ID)
from 
 table
where
 col1 = 'somerule'
and 
 DateTimeOfInsert >= '20150901' 
and 
 DateTimeOfInsert <= '20150930'

我唯一的问题是此时第一个查询返回
1073
,第二个查询返回
1124
。所以问题很明显:它们之间有什么区别?两者都应包括开始日期和结束日期。我看不出来。

区别在于
datetime
time
组件

这:

DateTimeOfInsert >= '20150901' and DateTimeOfInsert <= '20150930'
将选择它,因为您只检查月份和年份部分。这就是第二个select返回更多行的原因

<> P>两个查询将返回相同,如果您只更改第一个语句,以便考虑月最后一天的时间成分:

DateTimeOfInsert >= '20150901' and DateTimeOfInsert < '20151001'
DateTimeOfInsert>='20150901'和DateTimeOfInsert<'20151001'

区别在于
日期时间的
组件
时间

这:

DateTimeOfInsert >= '20150901' and DateTimeOfInsert <= '20150930'
将选择它,因为您只检查月份和年份部分。这就是第二个select返回更多行的原因

<> P>两个查询将返回相同,如果您只更改第一个语句,以便考虑月最后一天的时间成分:

DateTimeOfInsert >= '20150901' and DateTimeOfInsert < '20151001'
DateTimeOfInsert>='20150901'和DateTimeOfInsert<'20151001'
这种情况:

DateTimeOfInsert >= '20150901' and  DateTimeOfInsert <= '20150930'
上述条件也使您的查询具有可搜索性

有关一些常见的日期例程,请参见此条件:

DateTimeOfInsert >= '20150901' and  DateTimeOfInsert <= '20150930'
上述条件也使您的查询具有可搜索性


对于一些常见的日期例程,请参见此

老实说,我怀疑如果我使用
*
而不是
count(ID)
我会得到很多精确的时间条目,比如
9/2/2015 11:17 AM
9/4/2015 11:49 AM
。事实上,所有的“DateTimeOfInert”记录都有时间成分。无法了解您正在谈论的内容。事实上,
DateTimeOfInsert
记录具有时间组件,这对您的语句产生了影响,我已经解释了为什么…@fishmong3r,是的,您将获得带有时间组件的记录。但是请注意,没有超过
'2015-09-30 00:00:00.000'
的记录。老实说,我怀疑如果我使用
*
而不是
count(ID)
我会得到很多精确的时间条目,比如
9/2/2015 11:17 AM
9/4/2015 11:49 AM
。事实上,所有的“DateTimeOfInert”记录都有时间成分。无法了解您正在谈论的内容。事实上,
DateTimeOfInsert
记录具有时间组件,这对您的语句产生了影响,我已经解释了为什么…@fishmong3r,是的,您将获得带有时间组件的记录。但是请注意,没有超过
'2015-09-30 00:00:00.000'
的记录。关于这个-,有一些很好的阅读,也有一些关于这个-,也非常感谢。在这种情况下,我唯一的问题是:为什么我的原始Q中的第二种方法不够好?因为它不是可搜索的。您不应该在
WHERE
子句中的列上使用函数。@fishmong3r,如果您在谓词中的列上应用函数/某些计算,如datediff(…)、cast(…)、col+'.'等,然后就变得不可搜索了,这意味着不会使用在该列上创建的索引。通过您的方法,我也会得到这些记录:
10/1/2015 12:04 PM
@fishmong3r,对不起。本月初的日期应该是
DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0)
。谢谢。在这种情况下,我唯一的问题是:为什么我的原始Q中的第二种方法不够好?因为它不是可搜索的。您不应该在
WHERE
子句中的列上使用函数。@fishmong3r,如果您在谓词中的列上应用函数/某些计算,如datediff(…)、cast(…)、col+'.'等,然后就变得不可搜索了,这意味着不会使用在该列上创建的索引。通过您的方法,我也会得到这些记录:
10/1/2015 12:04 PM
@fishmong3r,对不起。本月初的日期应该是
DATEADD(MONTH,DATEDIFF(MONTH,0,GETDATE()),0)