SQL Server:查询条件 - 需要从datetime中提取日期

时间:2015-02-10 20:46:35

标签: sql sql-server-2005

我不能为我的生活让这个工作。我已经尝试了我在这里和整个互联网上看到的每一个例子。我正在尝试根据一个月的数据进行查询。我查询的视图中的数据采用以下格式:

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'

4 个答案:

答案 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日的所有内容,除非是第一秒。