SQL 服务器:查询条件 - 需要从日期时间中提取日期

SQL Server : Query criteria - need to extract date from datetime

我这辈子都做不到。我已经尝试了我在这里和整个互联网上看到的几乎所有示例。我正在尝试根据一个月的数据进行查询。我正在查询的视图中的数据采用以下格式:

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'

好方法(将在发布日期列上使用索引)

where lag.postingdate >= '20150101'
 and  lag.postingdate < '20150201'

简单但低效的方法(不会使用任何索引,即使在这个日期时间列上)

where MONTH(lag.postingdate) = 1
and   YEAR(lag.postingdate) = 2015 

你为什么不跳过所有的转换?

AND lag.postingdate 在“2015-01-01 00:00:00”和“2015-01-31 23:59:59”之间

请注意添加时间以使条件包含开始日期和结束日期 - 开始并不重要,但结束会错过 1 月 31 日的所有内容,除了第一秒。

试试这个:

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

回溯到 2008 年,您获得额外结果的真正原因是,无论发布日期如何,所写的查询都包含 posid = '1' 的所有内容。

您需要用括号将您的 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')你也可以避免parens问题。