这就是我在表xyz中所拥有的
NAME AMOUNT BEGIN_DATE END_DATE
ABC 5.0 2013-05-11 2014-06-20
以下是我想要使用的IBM DB2数据库
NAME AMOUNT BEGIN_DATE END_DATE
ABC 5.0 2013-05-11 2013-12-31
ABC 5.0 2014-01-01 2014-06-30
而不是xyz表中的一行,我需要获取2行作为上面的输出。 如何将一行拆分为两行?
答案 0 :(得分:1)
以下内容仅列出开始日期和结束日期恰好跨越两年或同一年的行。
SELECT
NAME,
AMOUNT,
BEGIN_DATE,
DATE(YEAR(BEGIN_DATE)||'-12-31') AS END_DATE
FROM xyz
WHERE YEAR(END_DATE)-YEAR(BEGIN_DATE)=1
UNION
SELECT
NAME,
AMOUNT,
DATE(YEAR(END_DATE)||'-01-01') AS BEGIN_DATE,
END_DATE
FROM xyz
WHERE YEAR(END_DATE)-YEAR(BEGIN_DATE)=1
UNION
SELECT
NAME,
AMOUNT,
BEGIN_DATE,
END_DATE
FROM xyz
WHERE YEAR(END_DATE)-YEAR(BEGIN_DATE)=0
ORDER BY BEGIN_DATE
答案 1 :(得分:0)
你可以制作两个SQL语句,选择第一个,使用'2013-12-31'作为结束日期的常量,然后选择第二次,使用'2014-01-01'作为常量开始日期。然后使用UNION ALL将它们放在一起。
如果您还有一些在2013年内开始和结束的记录,因此不需要拆分,您可以单独获取这些记录,并将其从其他两个查询中排除。您的数据中的其他变体可能需要一些额外的条件,但是这个例子可以帮助您:
select NAME, AMOUNT, BEGIN_DATE, END_DATE
from xyz
where END_DATE <= '2013-12-31'
UNION ALL
select NAME, AMOUNT, BEGIN_DATE, '2013-12-31'
from xyz
where END_DATE >= '2014-01-01'
UNION ALL
select NAME, AMOUNT, '2014-01-01', END_DATE
from xyz
where END_DATE >= '2014-01-01'