我不能为我的生活让这个工作。我已经尝试了我在这里和整个互联网上看到的每一个例子。我正在尝试根据一个月的数据进行查询。我查询的视图中的数据采用以下格式:
2012-03-20 00:00:00.000
使用以下标准,它会带回所有日期(或几乎所有日期)。有什么想法吗?
AND cast(convert(varchar(10), lag.postingdate, 112) as datetime) between '2015-01-01' and '2015-01-31'
原始查询:
SELECT
prov.pgrp_id AS PERFORMING_PROV_ID
, prov.pgrp_prov_name AS PERFORMING_PROV_NAME
, lag.chgno AS CHARGE_NUM
, lag/countcharges AS LAGTIME
, lag.chgamt
, lag.postingdate
FROM
dbo.Providers prov
RIGHT JOIN
dbo.LagTime_Charges_Calcs lag ON prov.pgrp_prov_cd = lag.provcode
AND prov.pgrp_practice = lag.px
LEFT JOIN
dbo.PlaceofService_union_v pos ON lag.px = pos.px
AND lag.poscode = pos.poscode
WHERE
pos.posid = '1'
OR pos.posid = '2'
AND prov.Laginclude = 'y'
AND MONTH(lag.postingdate) = 1
AND YEAR(lag.postingdate) = 2015
--and lag.postingdate between '2015-01-01 00:00:00.000' and '2015-01-31 23:59:59.000'
--AND cast(convert(varchar(10),lag.postingdate,112) as datetime) between '2015- 01-01' and '2015-01-31'
答案 0 :(得分:0)
好方法(将在postdate列上使用索引)
where lag.postingdate >= '20150101'
and lag.postingdate < '20150201'
简单但低效的方式(即使在此日期时间列上也不使用任何索引)
where MONTH(lag.postingdate) = 1
and YEAR(lag.postingdate) = 2015
答案 1 :(得分:0)
试试这个:
declare
@period_start datetime ,
@period_end datetime
set @period_start = '2015-01-01 00:00:00.000'
set @period_end = dateadd(month,1,@period_start)
select *
from foo
where foo.myDateTimeColumn >= @period_start
and foo.myDateTimeColumn < @period_end
答案 2 :(得分:0)
你回到2008年获得额外结果的真正原因是因为所写的查询包括posid =&#39; 1&#39;无论发布日期如何。
您需要将OR条件与括号分组:
WHERE (pos.posid='1' OR pos.posid ='2') and prov.Laginclude ='y'
and MONTH(lag.postingdate) = 1 and YEAR(lag.postingdate) = 2015
如果您使用pos.posid IN ('1', '2')
,也可以避免问题。
答案 3 :(得分:-1)
你为什么不跳过所有的演员?
AND lag.postingdate介于'2015-01-01 00:00:00'和'2015-01-31 23:59:59'
请注意添加时间使条件包含开始日期和结束日期 - 开始并不重要,但结尾将错过1月31日的所有内容,除非是第一秒。