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)
。