![]() |
Hmmm, har kliat skallen ett tag nu hur man gör en join på två datetime fält i MSSQL (Transact SQL). Problemet är givetvis tidsdelen av datumet som skiljer sig åt. Går det att klippa bort tiden när man gör denna join?
Kod:
Tabell1: |
Datum lagras oftast i form av flyttal där dagen bestäms av heltalsdelen och tiden av decimal-delen. Mig veterligen finns det ingen funktion för att trunkera datum till att enbart gå på heltalet, men en alternativ lösning som du kanske kan testa är ju att lägga in att den jämför om datumet ligger inom intervallet kl 00.00:00-23.59:59 under ett visst dygn. Om detta går att tillämpa i just en join-sats är jag dock osäker på.
|
Jag har testat att efter min select göra om datumet till en char med endast 10 tecken (går på andra sätt också), exemeplvis:
Kod:
men det fungerar ju inte... |
om du istället för:
tabell1.datum resp tabell2.datum skriver: covert(char(10),tabell1.datum,120) resp covert(char(10),tabell2.datum,120) så kommer du bara jämföra datum som är identiska. Fast om det är så att datat pga buggig inläggning (dvs den lägger in med tid trots att det är bara datumet som är intressant) så bör du kika på inläggningen istället så du slipper converta i selecten. De poster som redan finns kan ju i så fall enkelt uppdateras med en convert. |
Ser att du kom på lösningen själv...
Det jag tror du gör fel nu är att du inte gör en outer join. Det "som inte funkar" är att dina rader med "null" (för att datumen finns i en tabell men inte den andra) saknas. korrekt? |
Nja, min lösning fungerar ju inte riktigt.
Jag kan inte joina på datum1 och datum2 då får jag ett fel: invalid columnname 'datum1' (respektive 'datum2') Och det ska vara JOIN, dvs om jag har förstått JOIN'ar rätt. Jag har liksom flera tabeller med loggdata som ska paketeras ihop på "bredden" dvs data ifrån flera olika loggar ska skrivas in i olika fält på samma rad i recordset'et. En inner/outer/left join exkluderar ju åt endera hållet, här ska det vara villkorslöst. Ingen logg bestämmer om en annan logg ska finnas med mao. Och jag måste ha med tid i fältet för dessa tabeller används i andra sammanhang där tidsstämpel är viktig... |
Funkar inte?
Kod:
SELECT left/outer joins är ett måste om du vill ha "null där värde saknas", således måste du låte en tabell styra över den andra. Om du verkligen inte har någon tabell som styr så får du nog köra en union enligt principen: Välj alla som har matchning UNION alla som bara finns i T1 UNION alla som bara finns i T2. Kod:
select T1.*, T2.* FROM T1, T2 WHERE convert(char(10), T1.datum, 102) = convert(char(10), T2.datum, 102) |
Tack, ego.
Det blev en variant på dina UNION's som löste det. Kan inte mixtra så mycket med recordset'et pga den lösning jag har valt (jag skjuter in resultatet rakt in i en kontroll (asp.net vettu...) Jag får bjuda på en virtuell öl som tack för hjälpen. B) |
Citat:
|
Alla tider är GMT +2. Klockan är nu 14:18. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson