首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个日期范围和完全连接的SQL查询

具有多个日期范围和完全连接的SQL查询
EN

Stack Overflow用户
提问于 2012-02-03 04:40:49
回答 1查看 1.4K关注 0票数 0

我有一个在多个数据库表上运行完全联接的SQL查询。查询是基于用户输入的动态查询,但对于示例,我只包含了一些可能的输入。

我遇到的这个问题是,我需要按多个日期范围进行过滤,如果查询结果落在任何一个日期范围内,则返回查询结果。

我现在的查询是:

代码语言:javascript
复制
SELECT rank=COUNT(*)
   FROM    [LOM].[dbo].[lom_problem] problem
       FULL JOIN [LOM].[dbo].[lom_batch] batch on problem.lom_number = batch.lom_number
       FULL JOIN [LOM].[dbo].[lom_specimen] specimen on problem.lom_number = specimen.lom_number
       FULL JOIN [LOM].[dbo].[Main_LOM_Form] main on problem.lom_number = main.lom_number
           WHERE problem.problem = '102' AND batch.batch IS NULL AND main.practice_code IN('HPMR', 'DOCTORs2')
           AND main.occurrence_date >=Convert(datetime,'01/04/2012') AND main.occurrence_date <= Convert(datetime,'01/05/2012')
           OR main.received_date>=Convert(datetime,'01/04/2012') AND main.received_date <= Convert(datetime,'01/05/2012')

但是,该查询返回的结果就好像我的查询是

代码语言:javascript
复制
SELECT rank=COUNT(*)
   FROM    [LOM].[dbo].[lom_problem] problem
       FULL JOIN [LOM].[dbo].[lom_batch] batch on problem.lom_number = batch.lom_number
       FULL JOIN [LOM].[dbo].[lom_specimen] specimen on problem.lom_number = specimen.lom_number
       FULL JOIN [LOM].[dbo].[Main_LOM_Form] main on problem.lom_number = main.lom_number
           WHERE problem.problem = '102' AND batch.batch IS NULL AND main.practice_code IN('HPMR', 'DOCTORs2')
   AND main.occurrence_date >=Convert(datetime,'01/04/2012') AND main.occurrence_date <= Convert(datetime,'01/05/2012')

代码语言:javascript
复制
SELECT rank=COUNT(*)
   FROM    [LOM].[dbo].[lom_problem] problem
       FULL JOIN [LOM].[dbo].[lom_batch] batch on problem.lom_number = batch.lom_number
       FULL JOIN [LOM].[dbo].[lom_specimen] specimen on problem.lom_number = specimen.lom_number
       FULL JOIN [LOM].[dbo].[Main_LOM_Form] main on problem.lom_number = main.lom_number
           WHERE main.received_date>=Convert(datetime,'01/04/2012') AND main.received_date <= Convert(datetime,'01/05/2012')

如何让查询返回此部分完好无损的结果:

代码语言:javascript
复制
SELECT rank=COUNT(*)
   FROM    [LOM].[dbo].[lom_problem] problem
       FULL JOIN [LOM].[dbo].[lom_batch] batch on problem.lom_number = batch.lom_number
       FULL JOIN [LOM].[dbo].[lom_specimen] specimen on problem.lom_number = specimen.lom_number
       FULL JOIN [LOM].[dbo].[Main_LOM_Form] main on problem.lom_number = main.lom_number
           WHERE problem.problem = '102' AND batch.batch IS NULL AND main.practice_code IN('HPMR', 'DOCTORs2')

在此基础上再加上对任意日期范围的过滤:

代码语言:javascript
复制
           AND main.occurrence_date >=Convert(datetime,'01/04/2012') AND main.occurrence_date <= Convert(datetime,'01/05/2012')
           OR main.received_date>=Convert(datetime,'01/04/2012') AND main.received_date <= Convert(datetime,'01/05/2012')

谢谢!

编辑:我需要根据main.occurrence_date和main.received_date的数据范围进行过滤。如果数据区域出现在一列或另一列中,我需要返回计数。但是,我现在的查询返回where语句第一部分的和,然后返回第二部分的结果(在OR之后)。我认为这可能只是一个语法/格式问题,但我不确定。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-03 04:43:45

别忘了你的括号:

代码语言:javascript
复制
       WHERE problem.problem = '102' AND batch.batch IS NULL AND main.practice_code IN('HPMR', 'DOCTORs2')
       AND ((main.occurrence_date >=Convert(datetime,'01/04/2012') AND main.occurrence_date <= Convert(datetime,'01/05/2012'))
       OR (main.received_date>=Convert(datetime,'01/04/2012') AND main.received_date <= Convert(datetime,'01/05/2012'))

编辑:好的,让我们再试一次。我相信acermate433s的建议会让它更具可读性:

代码语言:javascript
复制
       WHERE problem.problem = '102' AND batch.batch IS NULL AND main.practice_code IN('HPMR', 'DOCTORs2')
       AND (main.occurrence_date BETWEEN Convert(datetime,'01/04/2012') AND Convert(datetime,'01/05/2012'))
       OR (main.received_date BETWEEN Convert(datetime,'01/04/2012') AND Convert(datetime,'01/05/2012'))

这就是你所想的吗?它将计算所有在指定范围内具有occurance_date的记录和所有在指定范围内具有received_date的记录,而不会对它们进行两次计数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9119667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档