SQL:将包含开始日期的表转换为仅保留其他列的日期

时间:2016-08-25 10:21:36

标签: sql date

据我所知,已经回答了许多类似的问题,但我认为似乎没有具体的问题?我可能错了,因为我对SQL也很新。因此,如果有人能够善意地解释并指出正确的方向,那就表示赞赏。

示例表如下所示,包含开始日期和结束日期,另外一列包含一些文本详细信息。一些结束日期为NULL。

Start Date  End Date    Day
25-05-15    28-05-15    text1
28-05-15                text2
30-05-15                text3
01-12-15                text4
31-05-16    02-06-16    text5
07-07-16                text6

我想将此表格转换为新表格,只显示所有日期,同时保留特定于日期的“日期”列。

Date        Day
25-05-15    text1
26-05-15    text1
27-05-15    text1
28-05-15    text1
28-05-15    text2
30-05-15    text3
01-12-15    text4
31-05-16    text5
01-06-16    text5
02-06-16    text5
07-07-16    text6

有人可以帮忙吗?提前谢谢!

3 个答案:

答案 0 :(得分:1)

如果您有一个包含您需要的所有日期的帮助表(例如1970-01-01的30K日期),您可以在给定的日期范围内将其与您的表格一起加入。此查询适用于MySQL:

select d.`Date`, t.`Day`
from mytable t
join `dates` d
  on  d.`Date` >= str_to_date(t.`Start Date`, '%d-%m-%y')
  and d.`Date` <= str_to_date(coalesce(`End Date`, `Start Date`), '%d-%m-%y')

http://sqlfiddle.com/#!9/2e3e1/1

您可以动态创建该帮助程序表,也可以将其存储在数据库中以供以后使用。如何创建该表取决于您的RDBMS。

答案 1 :(得分:0)

您可以尝试在脚本中执行此操作(这是Oracle):

DECLARE

  CURSOR dt_cursor IS
    SELECT StartDate               AS FromDate,
           NVL(EndDate, StartDate) AS ToDate,
           Day
    FROM   myTable;

  dt_val  dt_cursor%ROWTYPE;
  my_date DATE;

BEGIN

  FOR dt_val IN dt_cursor LOOP

    my_date = dt_val.FromDate;
    WHILE (my_date <= dt_val.ToDate) LOOP

      INSERT INTO newTable (Date, Day) VALUES (my_date, dt_val.Day);
      my_date := my_date + 1;

    END LOOP;

  END LOOP;

END;

答案 2 :(得分:0)

尝试使用以下SQL Server服务器脚本。

DROP TABLE #T
GO

CREATE TABLE #T
(StartDAte DATETIME,
 EndDate DATETIME,
 Day VARCHAR(50))


 INSERT INTO #T
 VALUES ('05-25-15','05-28-15','text1'), ('05-28-15',NULL,'text2')
        ,('05-30-15',NULL,'text3'),('12-01-15',NULL,'text4')
        ,('05-31-16','06-02-16','text5'),('07-07-16',NULL,'text6')

下面的脚本将为您提供结果集。

 SELECT [Date],[Day] 
 FROM #T
   CROSS APPLY (SELECT DATEADD(DAY,number,StartDAte) [Date]
                FROM master..spt_values
                WHERE type = 'P'
                AND DATEADD(DAY,number,StartDAte) < =ISNULL(EndDate,StartDate))t