比较 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 中存储过程中的比较的新表中

SQL Server:结合日期列和时间列,插入到日期时间列

SQL Server 2005 日期比较 - 排序问题

将日期字符串与 SQL Server 中的日期时间进行比较?

sql server 日期列格式