SQL Server : 比较 多 个 记录 中 的 日期

xcitsw88  于 2022-11-21  发布在  SQL Server
关注(0)|答案(1)|浏览(182)

在表格中建立零件时(“ASC_PMA_TBL”),则会自动生成一个编号。随后创建的任何“子部件”都有一个关联的编号。因此,例如,“主”部件可能是18245,它可能有几个子部件,如“18245-50”或“18245-40”等。子部件总是通过具有主部件编号来识别,后跟一个'-',然后是一个两位数。每个子部分都有一个与之关联的日期(“EO_DATE”)。我所要做的就是显示“主”日期与每个子部分日期不匹配的记录。所有数据都在一个表“ASC_PMA_TBL”中。
通常使用连接很容易做到这一点。但是在数据库中,子部分并不通过外键与它们的主部分相关联,所以我不得不找到一种不同的方法来做事情。
此外,日期字段是一个日期/时间字段,所以为了比较它们,我首先必须将该字段转换为仅包含日期的字段。我可以这样做,但无法在查询中使用别名!
任何帮助都非常感谢:)
我尝试过创建临时表和使用子查询,但无法解决此问题:(
UPDATE:使用临时表设法解决了这个问题,截断子部件的部件号以匹配主部件,然后连接两者以比较日期。可能很混乱,但它很有效!

SELECT
    PMA_PART_ONLY,
    CONVERT(DATE,PMA_EFFECT_DATE_OFF) As 'EO_DATE'
INTO
    ##MParts
FROM
    ASC_PMA_TBL
WHERE
    (PMA_PROC_CODE = 'M') AND
    (PMA_EFFECT_DATE_OFF IS NOT NULL)
SELECT
    PMA_PART_ONLY,
    CONVERT(DATE,PMA_EFFECT_DATE_OFF) As 'EO_DATE',
    SUBSTRING(PMA_PART_ONLY,0,CHARINDEX('-',PMA_PART_ONLY,0)) As 'MP_NO'
INTO
    ##SParts
FROM
    ASC_PMA_TBL
WHERE
    (PMA_PROC_CODE = 'S') AND
    (PMA_EFFECT_DATE_OFF IS NOT NULL)
SELECT
    ##SParts.PMA_PART_ONLY As 'SUB_PART_NO',
    ##MParts.EO_DATE As 'M_PART_DATE',
    ##SParts.EO_DATE As 'S_PART_DATE'
FROM
    ##MParts INNER JOIN ##SParts ON ##SParts.MP_NO = ##MParts.PMA_PART_ONLY
WHERE
    (##MParts.EO_DATE <> ##SParts.EO_DATE)
ORDER BY
    SUB_PART_NO DESC
    
DROP TABLE ##MParts
DROP TABLE ##SParts
mf98qq94

mf98qq941#

如果您只想比较日期而不想比较时间,则必须转换日期:

select *
from ASC_PMA_TBL master
inner join ASC_PMA_TBL parts
 ON parts.number like CAST(master.number AS VARCHAR(30)) + '[_]%'
where CAST(master.EO_DATE AS DATE) <> CAST(parts.EO_DATE AS DATE)

这是主要的想法,获得所有的母版和零件,其中零件编号类似于母版编号+下视镜。
请注意,在执行LIKE时,必须对[]引号中的“_”进行转义

相关问题