当前位置: 首页 > 面试题库 >

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

齐成和
2023-03-14
问题内容

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

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

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

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

处理此html" target="_blank">请求的最佳方法是什么?


问题答案:

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

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而言可以很好地工作。



 类似资料:
  • 基本上,我正在尝试从一个设定的日期创建一个包含一周所有日期的列表,并将其存储在数组中。但我有点麻烦。 基本上,今天是2016年3月9日,所以在数组中,我想存储: 这是我的代码: 如果有人能帮我就好了

  • 问题内容: 使用标准的mysql函数可以编写查询,该查询将返回两个日期之间的天数列表。 例如,给定2009-01-01和2009-01-13,它将返回一个具有以下值的列表: 编辑:看来我还不清楚。我要生成此列表。我在数据库中存储了值(按日期时间),但希望将它们在左外部联接中汇总到上述日期列表中(我希望这种联接的某些右侧在几天内会为null并将对此进行处理) )。 问题答案: 我将使用此存储过程将所

  • 在我的购物车应用程序中,我将所有购买日期存储在时间戳中。 假设,我想在n天前获得购买日期的时间戳(n是可配置的)。我将如何使用java获得它? 例如:类似于purchasedatebory5 days = current timestamp _ in _ days-5;我正在使用获取当前时间戳 我怎么能从中减去n天。我是初学者。请对此提供帮助。

  • 将选定时区中的当前时间作为日期对象的最佳方法是什么。我使用下面的代码在react Native中获取选定时区的当前时间。 例如new Date().toLocaleString('en-us',{timezone:'indian/christmas'})

  • 问题内容: 我想100天前从13年4月8日开始作为日期。 如何使用pl / sql执行此操作? 问题答案: 假设情况是您所处的字符串。因此,您需要将其转换为using函数,然后简单地减去100个文字。 的SQL 2 from dual 3 / RES 29-12-2012 PL / SQL 2 l_res_date date; 3 l_in_date varchar2(11) := ‘08-APR

  • 问题内容: 如果我有一个表列,,, 并且我想运行一个sql查询以获取数据集中最早的记录。 您可以在查询中执行此操作,还是需要在事实之后循环? 我想获取该记录的所有字段。 问题答案: 如果您只想要日期: 如果您需要所有信息: 尽可能避免循环。循环通常会导致游标,游标几乎从来没有必要,而且常常效率很低。