2017-10-02 1 views
1

J'ai un problème avec deux tables dont j'ai besoin de comparer des dates pour la même référence. Le problème est queComment faire correspondre partiellement la cellule avec une autre cellule partielle

  1. les dates sont différents formats et
  2. données superflues est également contenue dans les cellules de date.

mondial

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 

Local

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 

Notez que les formats de date entre les deux tables différentes et contiennent beaucoup de temps et zéro des données qui ne sont pas nécessaires. Donc, idéalement, je voudrais voir le format DD-MM-YYYY.

Je voudrais retourner uniquement les entrées Global et Local où la date locale diffère de la date globale. Donc, à partir des données ci-dessus, je veux voir:

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

je mettrais mes efforts à ce jour, mais pour être honnête, je n'ai aucune idée sur la façon d'aborder la mise en correspondance de cellule partielle et re-formatage.

Des idées?

Mise à jour: j'ai essayé une solution de @Sarslan et remplacé par mes noms de table et sur le terrain qui ont abouti à cette:

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 

Je continue à obtenir cette erreur:

Msg 241, Level 16, State 1, Line 7
Conversion failed when converting date and/or time from character string.

+0

pourquoi sont-ils stockés en tant que chaînes en premier lieu? L'utilisation d'un type de colonne date/heure réelle supprimerait des problèmes comme celui-ci – ADyson

+0

Malheureusement, c'est ainsi que les données ont été reçues de mon fournisseur.Je n'ai aucun contrôle sur la façon dont je le reçois. – bobtastic

Répondre

0

Merci pour toutes les réponses, mais trouvé une solution:

Créé une nouvelle colonne, puis couru cette requête pour confirmer e conversion:

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

Cela m'a donné le format alors j'ai couru la requête suivante pour mettre à jour la nouvelle colonne à la date formatée:

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

Heureusement ma date mondiale était déjà en datetime donc je puis simplement joint les deux tables et a couru ma comparaison contre le nouveau temps mis à jour

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; 
+0

Salut substitué votre formule à ma table et avoir ceci: sélectionnez * de ( sélectionnez glo.upc, to_char (glo.global_release_date, 'DD-mm-YYY') Date1, loc.upc, to_char (loc.terr_rel_date, ' JJ-mm-AAAA ') Date2 de emi.emi_global glo jointure interne emi.terr_release_dates loc sur (glo.upc = loc.upc) ) où Date1 <> Date2; Je reçois toujours une erreur: Msg 195, niveau 15, état 10, ligne 9 'to_char' n'est pas un nom de fonction intégré reconnu. – bobtastic

+0

FYI J'utilise MS SQL Server. Le 'to_char' semble être l'erreur – bobtastic

+1

Merci pour cet extrait de code, qui peut fournir une aide immédiate. Une explication appropriée [améliorerait considérablement] (https://meta.stackexchange.com/q/114762) sa valeur éducative en montrant pourquoi c'est une bonne solution au problème, et le rendrait plus utile aux futurs lecteurs avec des semblables, mais pas identique, des questions. Veuillez modifier votre réponse pour ajouter une explication et donner une indication des limites et des hypothèses qui s'appliquent. – GrumpyCrouton

0

pourrait tu essaies ça?

;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 

Résultat

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

Salut @sarslan, j'ai essayé de substituer mes noms de table et de champ et le code est dans mon post mais je reçois toujours l'erreur suivante: Msg 241, niveau 16, état 1, ligne 7 La conversion a échoué en convertissant la date et/ou l'heure chaîne de caractères. Des idées? – bobtastic

+0

Lorsque vous exécutez ce script 'SELECT CONVERT (DATE, GAUCHE ('1992-08-25 00: 00: 00.000', CHARINDEX ('', '1992-08-25 00: 00: 00.000')), 120), CONVERSION (DATE, GAUCHE ('25 .08.1992 00: 00: 00.000000000 GMT ', CHARINDEX (' ', '25 .08.1992 00: 00: 00.000000000 GMT')), 104) 'avez-vous des erreurs? –

0

Lorsque vous avez une chaîne formatée que le format ne changera jamais, vous pouvez simplifier comme ça - cela aussi vous donner plus de flexibilité -:

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