【问题标题】:How to partially Match cell against another partial cell如何将单元格与另一个部分单元格部分匹配
【发布时间】:2017-10-02 16:05:15
【问题描述】:

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

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

全球

No. Date
1   1992-08-25 00:00:00.000
2   2015-05-19 00:00:00.000
3   2000-01-12 00:00:00.000

本地

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

到目前为止,我会进行尝试,但老实说,我不知道如何解决部分单元格匹配和重新格式化问题。

有什么想法吗?

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

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

我不断收到此错误:

消息 241,第 16 级,状态 1,第 7 行
从字符串转换日期和/或时间时转换失败。

【问题讨论】:

  • 为什么首先将它们存储为字符串?使用实际的日期/时间列类型将消除这样的问题
  • 不幸的是,这就是从我的供应商那里收到数据的方式。我无法控制如何接收它。

标签: sql sql-server tsql datetime


【解决方案1】:
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;

【讨论】:

  • 您好,将您的公式替换到我的表中并具有以下内容: select * from ( select glo.upc, to_char(glo.global_release_date,'DD-mm-YYY') Date1 , loc.upc, to_char( loc.terr_rel_date,'DD-mm-YYY') Date2 from emi.emi_global glo inner join emi.terr_release_dates loc on (glo.upc=loc.upc) ) where Date1Date2;我不断收到错误消息:Msg 195, Level 15, State 10, Line 9 'to_char' is not a known built-in function name。
  • 仅供参考,我使用的是 MS SQL Server。 'to_char' 似乎正在引发错误
  • 感谢您提供此代码 sn-p,它可能会提供一些即时帮助。正确解释would greatly improve 其教育价值,通过说明为什么这是解决问题的好方法,并使其对未来有类似但不相同问题的读者更有用。请编辑您的答案以添加解释,并说明适用的限制和假设。
【解决方案2】:

你能试试这个吗?

;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

【讨论】:

  • 嗨@sarslan,我尝试替换我的表和字段名称,代码在我的帖子中,但我不断收到以下错误:Msg 241, Level 16, State 1, Line 7 Conversion failed when conversion字符串中的日期和/或时间。有什么想法吗?
  • 当您运行此脚本SELECT CONVERT(DATE,LEFT('1992-08-25 00:00:00.000', CHARINDEX(' ', '1992-08-25 00:00:00.000')),120) , CONVERT(DATE,LEFT('25.08.1992 00:00:00.000000000 GMT', CHARINDEX(' ', '25.08.1992 00:00:00.000000000 GMT')),104) 时是否遇到任何错误?
【解决方案3】:

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

;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);

【讨论】:

    【解决方案4】:

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

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

    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)
    

    幸运的是,我的全球日期已经在日期时间中,所以我只需加入这两个表并与新的更新时间进行比较

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 2019-08-28
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      相关资源
      最近更新 更多