如何将单元格与另一个部分单元格部分匹配

时间:2017-10-02 16:05:16

标签: sql sql-server tsql datetime

我有两个表的问题,我需要比较相同参考的日期。问题是

  1. 日期是不同的格式和
  2. 两个日期单元格中也包含多余的数据。
  3. 全局

    No. Date
    1   25.08.1992 00:00:00.000000000 GMT
    1   28.08.1992 00:00:00.000000000 GMT
    2   19.05.2015 00:00:00.000000000 GMT
    3   12.01.2000 00:00:00.000000000 GMT
    3   17.01.2000 00:00:00.000000000 GMT
    

    本地

    DD-MM-YYYY

    请注意,两个表之间的日期格式不同,包含大量时间和不需要的零数据。理想情况下,我希望格式为No. Date No. Date 1 25-08-1992 1 28-08-1992 3 12-01-2000 3 17-01-2000

    我想仅返回本地日期与全球日期不同的全局和本地条目。所以从上面的数据来看,我想看看:

    WITH G AS 
    (
        SELECT [UPC], CONVERT(DATE,LEFT([GLOBAL RELEASE DATE], CHARINDEX(' ', 
    [GLOBAL RELEASE DATE])),120)  [Date] FROM [dsched_migration].[emi].
    [EMI_Global]
    ) 
    ,L AS 
    (
        SELECT [UPC], CONVERT(DATE,LEFT([TERR_REL_DATE], CHARINDEX(' ', 
    [TERR_REL_DATE])),104)  [Date] FROM [dsched_migration].[emi].
    [terr_release_dates]
    ) 
    SELECT 
        G.UPC, CONVERT(VARCHAR,G.Date,105) [GLOBAL RELEASE DATE],
        L.UPC, CONVERT(VARCHAR,L.Date,105) [TERR_REL_DATE]   
    FROM 
        G INNER JOIN L ON L.UPC = G.UPC
    WHERE L.Date <> G.Date
    

    到目前为止我会尝试,但说实话,我不知道如何处理部分单元格匹配和重新格式化。

    有什么想法吗?

    更新: 我尝试了@Sarslan的解决方案并替换了我的表和字段名称,结果是:

    class TranslationText {
        Language language
        String text
    
        static mapping = {
            language cascade: 'evict'
        }
    }
    

    我一直收到这个错误:

      

    Msg 241,Level 16,State 1,Line 7
      从字符串转换日期和/或时间时转换失败。

4 个答案:

答案 0 :(得分:0)

select * from
(
select a.no, to_char(a.date,'DD-mm-YYY') Date1 , b.no, to_char(b.date,'DD-mm-YYY') Date2
from Global a inner join Local b on (a.no=b.no)
)
where Date1<>Date2;

答案 1 :(得分:0)

你可以尝试一下吗?

;WITH G AS 
(
    SELECT [No], CONVERT(DATE,LEFT([Date], CHARINDEX(' ', [Date])),120)  [Date] FROM [GLobal]
) 
,L AS 
(
    SELECT [No], CONVERT(DATE,LEFT([Date], CHARINDEX(' ', [Date])),104)  [Date] FROM [Local]
) 
SELECT 
    G.No, CONVERT(VARCHAR,G.Date,105) [Date],
    L.No, CONVERT(VARCHAR,L.Date,105) [Date]    
FROM 
    G INNER JOIN L ON L.No = G.No
WHERE L.Date <> G.Date

结果

No          Date                           No          Date
----------- ------------------------------ ----------- ------------------------------
1           25-08-1992                     1           28-08-1992
3           12-01-2000                     3           17-01-2000

答案 2 :(得分:0)

当你有一些格式化的字符串时,格式永远不会改变你可以像这样简化它 - 这也会给你更大的灵活性 - :

;with tg as (
    select [No], 
        -- Format is : yyyy-mm-dd
        left([Date], 4) yyyy, substring([Date], 6, 2) mm, substring([Date], 9, 2) dd
    from g
), tl as (
    select [No], 
        -- Format is: dd-mm-yyyy
        substring([Date], 7, 4) yyyy, substring([Date], 4, 2) mm, left([Date], 2) dd
    from l
)
select *
from tg
inner join tl
  on tg.[No] = tl.[No]
 and not (tg.yyyy = tl.yyyy and tg.mm = tl.mm and tg.dd = tl.dd);

答案 3 :(得分:0)

感谢所有回复,但找到了解决方案:

创建一个新列然后运行此查询以确认转换:

SELECT  '19.10.2009 00:00:00.000000000 GMT',
        CONVERT(datetime, LEFT('19.10.2009 00:00:00.000000000 GMT',10), 104) 

这给了我正确的格式然后我运行以下查询以使用格式化日期更新新列:

update LocalDate
      set REL_DATE = CONVERT(datetime, LEFT(TERR_REL_DATE,10), 104)

幸运的是我的全球日期已经在日期时间,所以我只是简单地加入了两个表格并对新的更新时间进行了比较