如何编写具有2个日期范围的sql子查询

时间:2014-01-25 04:27:57

标签: sql reporting-services

我是SQL的新手,我对以下SSRS报告所需的查询有困难。

我们有一个表列出了名称和日期。日期对应于该人参加活动的日期。我们想要运行带有日期范围的查询,并提取已参加该日期范围内事件的名称列表及其所有出勤日期,即使其中一个日期超出范围

所以对于表

NAME, DATE OF ATTENDENCE
ALICE, 1/1/2000
BOB, 1/1/2000
CHARLIE, 1/1.2000
ALICE, 1/1/2001
ALICE, 1/1/2002
BOB, 1/1/2002

我们希望查询一年,比如2002年,然后查看参加02年活动的所有人的列表,以及这些人的所有其他出勤日期,所以2002年会显示

ALICE, 1/1/2000
ALICE, 1/1/2001
ALICE, 1/1/2002
BOB, 1/1/2000
BOB, 1/1/2002

我遇到了如何解决这个问题的麻烦,我认为我需要多个查询,但我不能完全理解如何做到这一点。

任何帮助或建议将不胜感激。

感谢。

MC

3 个答案:

答案 0 :(得分:0)

您可以使用exists子句执行此操作:

select e.*
from events e
where exists (select 1
              from events e2
              where e2.name = e.name and
                    year(e2.DateOfAttendence) = 2002
             );

答案 1 :(得分:0)

您将希望使用嵌套查询。请考虑下表:

CREATE TABLE IF NOT EXISTS `events` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  `when` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
);

然后,您可以使用以下查询获取您请求的所有信息:

select * from `events` where name in (
  SELECT distinct name
  FROM `events`
  WHERE `when` >= STR_TO_DATE('24/01/2014', '%d/%m/%Y')
  and `when` <= STR_TO_DATE('26/01/2014', '%d/%m/%Y')
)

..得到了忍者:( ..

答案 2 :(得分:0)

我不认为子查询是你问题的答案。子查询只返回一个字段。 相反,你可以使用嵌套查询。

寻找类似的东西

Select  *
        From    TimeTable
        Where   Id  In
                    (
                        Select  Id
                                From    TimeTable
                                Where   Date >= TO_DATE('01/01/2002 00:00:00', 'MM/DD/YYYY HH:MI:SS') And
                                        Date <   TO_DATE('01/01/2003 00:00:00', 'MM/DD/YYYY HH:MI:SS') 
                    )