16. maj 2002 - 08:41Der er
43 kommentarer og 3 løsninger
datosammenligning
Hej!
jeg har 2 tabeller hvor jeg prøver at finde alle datoer fra tabel1 som er forskellig fra de datoer som findes i tabel2. Tabel1`s datofelt har typen "smalldatetime", og tabel2`s datofelt har typen "datetime". (det kan der ikke laves om på) ------------------------------------------------- SELECT tabel1.*, ISNULL(tabel2.Dato, '') AS DatoFindesIkke FROM tabel1 LEFT OUTER JOIN tabel2 ON tabel1.Dato = tabel2.Dato ------------------------------------------------- Resultatet af ovenstående select bliver at DatoFindesIkke bliver "01-01-1900", så der er noget jeg mangler.
select tabel1.*, case when tabel2.dato is null then '<null>' else tabel2.dato end as datofindesikke from tabel1 left outer join tabel2 on tabel1.dato = tabel2.dato
Når jeg kører den i query analyzer får jeg besked om at case ikke er supporteret. Den finder desuden kun 1 dato fra tabellen, og der er flere forskellige...
Du kan formentlig ikke joine 2 felter med forskellig definition og forvente et brugbart resultat. I stedet kan du konvertere felterne til noget sammenligneligt: SELECT tabel1.* FROM Tabel1 WHERE Format$(tabel1.dato, "yyyymmdd") NOT IN (SELECT Format$(tabel2.dato, "yyyymmdd") FROM tabel2) Jeg går her ud fra at MSSQL kan håndtere er FORMAT.
hansk>den oprindelige forespørgsel brugte en left join mellem tabel1 og tabel2. Der blev ikke fravalgt de poster, hvor tabel2.dato var null. Derfor svarer din forespørgsel ikke til den oprindelige.
Jeg har prøvet alle forslag, men jeg syntes der mangler noget...
på min asp-side prøver jeg så at skrive
sqlstr = "SELECT tabel1.* FROM Tabel1 WHERE tabel1.dato NOT IN (SELECT tabel2.dato FROM tabel2)" set rs = conn.Execute(sqlstr) If rs.eof = true then Response.Write "Dato findes ikke" else Response.Write "dato findes" end if
hvis der nu er 6 rækker i tabel1, hvoraf 2 af rækkerne har en dato der ikke findes i tabel2, men tabel2 indeholder 300 rækker, hvordan får jeg den så til at skrive "findes ikke" 2 gange og "findes" 4 gange?
Altså således: SELECT tabel1.* FROM tabel1 LEFT OUTER JOIN tabel2 ON tabel1.Dato = tabel2.Dato AND tabel1.id = tabel2.id AND tabel2.dato IS Null WHERE (CONVERT(Datetime, Dato, 102) NOT IN (SELECT tabel2.dato FROM tabel2)) (jeg skal også lige have et ID med...)
Og hvordan så med asp? vil jeg ikke stadig få skrevet mange rækker ud???
SELECT tabel1.*, tabel2.dato FROM tabel1 LEFT OUTER JOIN tabel2 ON tabel1.Dato = tabel2.Dato AND tabel1.id = tabel2.id
På denne måde vil ens datoer vise sig ved at tabel2.dato har en valid værdi og manglende datoer vise sig ved at tabel2.dato har en null værdi. Brug denne sammen med din do-while løkke og så er din lykke gjort.
Nu fandt jeg løsningen (efter et kig i hjælpen i sql server):
CONVERT gav problemer, men CAST virker bedre:
SELECT tabel1.*, ISNULL(CAST(tabel2.Dato as varchar(30)),'') AS bInvalidDate FROM tabel1 LEFT OUTER JOIN tabel2 ON tabel1.Dato = tabel2.Dato AND tabel1.id = tabel2.id
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.