这是我在表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行,而不是只从xyz表中提取一行。如何将一行拆分为两行?
发布于 2014-11-26 03:29:57
下面将只列出开始日期和结束日期正好跨越两年或在同一年内的行。
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
发布于 2014-11-26 02:38:35
您可以创建两个SQL语句,以选择第一个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'
https://stackoverflow.com/questions/27133942
复制相似问题