一尘不染

SQL获取日期列表以及前后没有重复的日期

sql

我需要显示一张表中的日期列表

SELECT mydate AS MyDate, 1 AS DateType
FROM myTable
WHERE myTable.fkId = @MyFkId;

2010年1月1日-2010年1
月2日-2010年1
月10日-1

没问题。但是,我现在需要使用不同的DateType显示之前的日期和之后的日期。

2009年12月31日-
2010年1月1日-2010年1
月2日-2010年1
月3日- 2010年1月2日- 2010年1月2日-
2010年1
月10日-2010年1
月11日-2

我以为我可以用工会

SELECT MyDate, DateType
FROM (
    SELECT mydate - 1 AS MyDate, 2 AS DateType
    FROM myTable
    WHERE myTable.fkId = @MyFkId;

    UNION

    SELECT mydate + 1 AS MyDate, 2 AS DateType
    FROM myTable
    WHERE myTable.fkId = @MyFkId;

    UNION

    SELECT mydate AS MyDate, 1 AS DateType
    FROM myTable
    WHERE myTable.fkId = @MyFkId;
) AS myCombinedDateTable

但是,这包括原始日期的副本。

2009年12月31日-
2010年1
月1日-2010年1
月2日- 2010年1月2日- 2010年1月2日-
2010年1
月3日- 2010年1月2日- 2010年1月2日- 2010年1月
2
日-
11月1日,2010-2

如何最好地删除这些重复项?我正在考虑使用临时表,但是不确定这是否是最好的方法。

在我看来,这可能会带来性能问题,因为我在三个不同的时间运行相同的查询。

处理此请求的最佳方法是什么?


阅读 238

收藏
2021-03-08

共1个答案

一尘不染

尽管您已经接受了该解决方案,但让我将此解决方案作为参考:

SELECT MyDate, Min(DateType)
From
(
  SELECT MyDate + T1.RecordType AS MyDate, T1.DateType
  FROM
  (
    Select 1 AS RecordType, 2 AS DateType
    Union ALL
    Select 0 AS RecordType, 1 AS DateType
    Union ALL
    Select -1 AS RecordType, 2 AS DateType
  ) AS T1
  CROSS JOIN myTable
  Where myTable.fkId = @MyFkId
) AS CombinedTable
Group By MyDate

此解决方案的优势在于,仅查询一次myTable,在当前情况下,我们对fkID进行了过滤,因此现在的性能将无关紧要,但是,如果我们必须评估复杂的查询,则该技术就Union而言可以很好地工作。

2021-03-08