SQL获取日期列表以及之前和之后的天数而不重复

标签 sql sql-server sql-server-2005

我需要显示表格中的日期列表

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

Jan 1, 2010 - 1
Jan 2, 2010 - 1
Jan 10, 2010 - 1

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

Dec 31, 2009 - 2
Jan 1, 2010 - 1
Jan 2, 2010 - 1
Jan 3, 2010 - 2
Jan 9, 2010 - 2
Jan 10, 2010 - 1
Jan 11, 2010 - 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

但这包括原始日期的重复。

Dec 31, 2009 - 2
Jan 1, 2010 - 2
Jan 1, 2010 - 1
Jan 2, 2010 - 2
Jan 2, 2010 - 1
Jan 3, 2010 - 2
Jan 9, 2010 - 2
Jan 10, 2010 - 1
Jan 11, 2010 - 2

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

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

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

最佳答案

这应该适合你:

SELECT MyDate, min(DateType) as 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 ALL

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

注意:我将第二个 UNION 更改为 UNION ALL 以获得更好的性能;最后一个子查询永远不会与前两个子查询重复,因为前两个子查询的 DateType 始终为 2,最后一个 UNIONed 查询始终为 1。

关于SQL获取日期列表以及之前和之后的天数而不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2427333/

相关文章:

asp.net - 使用嵌套集合更新模型,ASP.NET MVC

sql - 使用row_number从查询中获取@@ rowcount的有效方法

sql-server-2005 - 需要在 sql server 2005 中使用 ROW_NUMBER 而不结束

c# - 使用 LINQ 检查计划重叠

mysql - 如何将日期字符串 "yyyy-mm-ddThh:mm:ssZ"转换为时间戳

sql - 在包中找不到 SSIS 连接

sql-server - 在合并查询的 Insert 语句中使用 Select From table

Java 事务 - 在 conn 上提交不会

mysql - 如何构建基于列值唯一的结果计数的查询?

mysql - MariaDB 循环的隐式游标似乎不起作用