据我所知,已经回答了许多类似的问题,但我认为似乎没有具体的问题?我可能错了,因为我对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
有人可以帮忙吗?提前谢谢!
答案 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