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