比较 SQL Server 中 3 列之间的日期值并在 SQL Server 中提取资产信息
Posted
技术标签:
【中文标题】比较 SQL Server 中 3 列之间的日期值并在 SQL Server 中提取资产信息【英文标题】:Compare date values between 3 columns in SQL Server and pull asset information in SQL Server 【发布时间】:2016-05-17 00:40:26 【问题描述】:我有一个包含三个日期列和一些资产信息的表格。
资产(APPR_DATE_1、APPR_DATE_2、APPR_DATE_3、ID、姓名、地址...)样本数据:
'1-1-2010','1-1-2012','1-1-2015',1,'Peter','USA'....
'1-1-2015','1-10-2014','1-19-2013',2,1,'John','USA'....
'1-1-2008','1-25-2010','4-29-2011',3,'Edward','UK'....
'1-25-2012','10-25-2011','9-11-2013',4,'Nancy','Kenya'....
想要的结果:
'1-1-2010','1-1-2012','1-1-2015',1,'Peter','USA'....
'1-1-2008','1-25-2010','4-29-2011',3,'Edward','UK'....
'1-25-2012','10-25-2011','9-11-2013',4,'Nancy','Kenya'....
如果您看到结果集,它包含的数据比样本数据少 1 行。结果集仅包含最近日期和第二最近日期之间的差异大于 365 或第二最近日期和最旧日期之间的差异大于 365 的那些行
他们有随机的日期。对于每一行,我需要找到最近的、最近的和最旧的日期,一旦得到,我需要比较 -
列出最近日期和第二最近日期之间的差值大于 1 年的资产信息。
列出第二个最近日期和最早日期之间的差值大于 1 年的资产信息。
第 2 点不应包含第 1 点中已包含的资产
Col ID
是独一无二的。这在 SQL 中可行吗?
【问题讨论】:
是的,这是可能的。但为了让我们帮助您,请通过提供示例数据和预期结果来帮助我们了解您的问题。 你需要从一些东西开始。所以从SELECT * FROM ASSET
开始。下次试试SELECT *, DATEDIFF(y,APPR_DATE_1, APPR_DATE_2) As Diff1 FROM ASSET
。你知道如何从中建立它吗?这只是一堆基于DATEDIFF
结果的布尔逻辑。繁琐的部分是,如果三个日期的顺序是随机的,你需要尝试每一个组合。
或者您可以从一些逻辑开始以一致地排序日期并以此为基础:SELECT CASE WHEN APPR_DATE_1 > APPR_DATE_2 AND APPR_DATE_1 > APPR_DATE_3 THEN APPR_DATE_1 WHEN APPR_DATE_2 > APPR_DATE_1 AND APPR_DATE_2 > APPR_DATE_3 THEN APPR_DATE_2 ELSE APPR_DATE_3 END D1 FROM ASSET
@FelixPamittan - 嘿,我添加了示例数据。如果您还需要什么,请告诉我。
@FelixPamittan - 嘿抱歉,我更新了我的结果。如果您看到结果集,它包含的数据比样本数据少 1 行。结果集仅包含最近日期和第二最近日期之间的差值大于 365 或第二个最近日期和最旧日期之间的差值大于 365 的行
【参考方案1】:
使用CASE
表达式来确定最近、第二和最旧的日期。将它们放在CTE
中并使用WHERE
子句中的列名
WITH CTE AS(
SELECT *,
RecentDate =
CASE
WHEN APPR_DATE_1 >= APPR_DATE_2 AND APPR_DATE_1 >= APPR_DATE_3 THEN APPR_DATE_1
WHEN APPR_DATE_2 >= APPR_DATE_3 AND APPR_DATE_2 >= APPR_DATE_1 THEN APPR_DATE_2
WHEN APPR_DATE_3 >= APPR_DATE_2 AND APPR_DATE_3 >= APPR_DATE_1 THEN APPR_DATE_3
END,
SecondDate =
CASE
WHEN APPR_DATE_1 BETWEEN APPR_DATE_2 AND APPR_DATE_3 OR APPR_DATE_1 BETWEEN APPR_DATE_3 AND APPR_DATE_2 THEN APPR_DATE_1
WHEN APPR_DATE_2 BETWEEN APPR_DATE_1 AND APPR_DATE_3 OR APPR_DATE_1 BETWEEN APPR_DATE_3 AND APPR_DATE_1 THEN APPR_DATE_2
WHEN APPR_DATE_3 BETWEEN APPR_DATE_1 AND APPR_DATE_2 OR APPR_DATE_1 BETWEEN APPR_DATE_2 AND APPR_DATE_1 THEN APPR_DATE_3
END,
OldestDate =
CASE
WHEN APPR_DATE_1 <= APPR_DATE_2 AND APPR_DATE_1 <= APPR_DATE_3 THEN APPR_DATE_1
WHEN APPR_DATE_2 <= APPR_DATE_3 AND APPR_DATE_2 <= APPR_DATE_1 THEN APPR_DATE_2
WHEN APPR_DATE_3 <= APPR_DATE_2 AND APPR_DATE_3 <= APPR_DATE_1 THEN APPR_DATE_3
END
FROM #ASSET
)
SELECT
APPR_DATE_1, APPR_DATE_2, APPR_DATE_3, ID, NAME, ADDRESS
FROM CTE
WHERE
DATEDIFF(DAY, SecondDate, RecentDate) > 365
OR DATEDIFF(DAY, OldestDate, SecondDate) > 365
ONLINE DEMO
【讨论】:
【参考方案2】:查询似乎很忙,但它应该适合您。
select * from
(
--then pivot it back to get the columns in order
select id,
[1] as APPR_DATE_1
,[2] as APPR_DATE_2
,[3] as APPR_DATE_3
from(
select id , APPR_DATE ,row_number() over (partition by id order by APPR_DATE asc) as rowid
from (
--unpivot first
select id , APPR_DATE_1 ,APPR_DATE_2,APPR_DATE_3 from #table
) as cp
unpivot
(
APPR_DATE for APPR_DATES in (APPR_DATE_1 ,APPR_DATE_2,APPR_DATE_3)
) as up
) as x
pivot
(
max(APPR_DATE)
for
rowid in ([1],[2],[3])
)
as pv
)xx
where datediff("dd",APPR_DATE_1,APPR_DATE_2)/365 <> 0 or
datediff("dd",APPR_DATE_2,APPR_DATE_3)/365 <> 0
【讨论】:
以上是关于比较 SQL Server 中 3 列之间的日期值并在 SQL Server 中提取资产信息的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server,HQL:如何将 SQL Server 日期时间列字段与日期进行比较
如何比较两个表的列并将值插入到基于 SQL Server 中存储过程中的比较的新表中