---
title: "Subdate?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/164264-subdate"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Inferis"
published: "2007-09-07T20:56:20.000Z"
updated: "2007-09-08T18:57:49.000Z"
replies: 19
views: 857
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/164264-subdate"
---

# Subdate?

## #1 — Inferis, 2007-09-07T20:56Z

Varför raderas allt även om tidsintervallen ligger under 120 minuter?

```
DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2 OR svar = 3
```

Permalänk: https://www.webforum.nu/p/164264

## #2 — Peter S, 2007-09-07T21:00Z

Du saknar parenteser kring det första 'svar' och '3', alternativt

```
DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar IN (2,3)
```

Permalänk: https://www.webforum.nu/p/2026295

## #3 — Inferis, 2007-09-07T21:04Z

Hmm.
Varför kunde man inte göra på mitt sätt?

Tack förresten!

Permalänk: https://www.webforum.nu/p/2026296

## #4 — Peter S, 2007-09-07T21:08Z

Det har att göra med hur det logiska uttrycket evalueras. I det här fallet sitter det implicita parenteser kring (Last \< ... and svar = 2), så en rad i 'mess' raderas om
1) Last \< SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2, **eller**
2) svar = 3

Permalänk: https://www.webforum.nu/p/2026297

## #5 — Inferis, 2007-09-07T21:11Z

Vad gjorde min kod då? Det var så jag trodde att jag gjorde.

Permalänk: https://www.webforum.nu/p/2026298

## #6 — Peter S, 2007-09-07T21:17Z

Nu börjar vi om ;) En rad i 'mess' skall raderas om...?

Permalänk: https://www.webforum.nu/p/2026300

## #7 — Inferis, 2007-09-07T21:22Z

Den är äldre än 120 minuter och fältet svar är antingen 2 eller 3..

Permalänk: https://www.webforum.nu/p/2026304

## #8 — Peter S, 2007-09-07T21:26Z

Då är ditt första försök felaktigt p.g.a. vad som står i inlägg #4. Vi kan vända på det: en rad i 'mess' raderas om:
1) svar = 3 (oavsett om Last \< subdate(...)), **eller**
2) Last \< SUBDATE(NOW(),INTERVAL 120 minute) **och** svar = 2

Permalänk: https://www.webforum.nu/p/2026305

## #9 — colione, 2007-09-07T21:27Z

Och vad som händer är att den tar bort alla poster som är äldre än 120 minuter och har svar = 2 ELLER alla poster vars svar är lika med tre (utan andra vilkor) detta för att eller väger tyngre än och. om man ska lösa det på ditt sätt blir det:

DELETE FROM mess WHERE Last \< SUBDATE(NOW(),INTERVAL 120 minute) AND (svar = 2 OR svar = 3)

Fast Peter S lösning är snyggare.

> DELETE FROM mess WHERE Last \< SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2 OR svar = 3

är egentligen lika med:

DELETE FROM mess WHERE (Last \< SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2) OR svar = 3

Permalänk: https://www.webforum.nu/p/2026306

## #10 — Inferis, 2007-09-07T21:43Z

Skulle detta funka? Bara undrar.

```
DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2 OR  Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar =  3
```

Permalänk: https://www.webforum.nu/p/2026317

## #11 — Inferis, 2007-09-07T21:44Z

> **colione skrev:**
>
> Och vad som händer är att den tar bort alla poster som är äldre än 120 minuter och har svar = 2 ELLER alla poster vars svar är lika med tre (utan andra vilkor) detta för att eller väger tyngre än och.

Det stämmer inte. Den tog bort poster som hade svar = 2 och var en minut gamla.

Permalänk: https://www.webforum.nu/p/2026318

## #12 — Inferis, 2007-09-07T21:47Z

Följdfråga. Hur lägger man in tex att för varje mess som raderas så ska det kollas ifall fältet Img innehåller data. Om så är fallet, radera bilden med det namnet?

Permalänk: https://www.webforum.nu/p/2026319

## #13 — Peter S, 2007-09-07T23:36Z

> **Inferis skrev:**
>
> Skulle detta funka? Bara undrar.
>
>
> ```
> DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar = 2 OR  Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar =  3
> ```

Ja, det fungerar, eftersom AND binder starkare än OR.

> **Inferis skrev:**
>
> Följdfråga. Hur lägger man in tex att för varje mess som raderas så ska det kollas ifall fältet Img innehåller data. Om så är fallet, radera bilden med det namnet?

Om bilden ligger i en annan tabell bör du ha satt upp något slags referensvillkor som säger "om raden x i 'mess' raderas, så skall raden y i bildtabellen raderas". Gör en sökning på exempelvis ON DELETE CASCADE och REFERENCES.

Permalänk: https://www.webforum.nu/p/2026342

## #14 — Inferis, 2007-09-08T13:49Z

Bildens namn finns bara i den tabellen.
Hur är en optimal lösning på denna koden?

```
'Kolla om ett meddelande har bild med sig 
SQL = "SELECT mess,img,Last,svar FROM mess where Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar IN (2,3)"
Set RS = Connection.Execute(SQL)
Do While NOT RS.EOF
	If RS("img") <> "" Then 'Det finns en bild! Radera den
		Set fso = Server.CreateObject("Scripting.FileSystemObject")
		fso.DeleteFile(Server.MapPath("..\..\messbilder\public_html\meddelanden") & "\" & RS("img"))
		Set Fso = nothing
	else 'Finns ingen bild
	End if
RS.MoveNext
Loop
RS.Close : Set RS = Nothing

'Radera meddelanden
connection.execute("DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar IN (2,3)")
```

Permalänk: https://www.webforum.nu/p/2026476

## #15 — Peter S, 2007-09-08T17:08Z

Jag kan tänka mig följande:

```
'Kolla om ett meddelande har bild med sig 
SQL = "SELECT img FROM mess where Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar IN (2,3) AND img is not null"
Set RS = Connection.Execute(SQL)
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Do While NOT RS.EOF
	fso.DeleteFile(Server.MapPath("..\..\messbilder\public_html\meddelanden") & "\" & RS("img"))
	RS.MoveNext
Loop
Set Fso = nothing
RS.Close : Set RS = Nothing

'Radera meddelanden
connection.execute("DELETE FROM mess WHERE Last < SUBDATE(NOW(),INTERVAL 120 minute) AND svar IN (2,3)")
```

Detta förutsätter att om en bild inte existerar så sparas NULL i stället. Om inte NULL sparas utan en tom sträng, kan du ändra *AND img is not null* till *AND img \<\> ''*. Det förstnämnda förfarandet är att föredra.

Permalänk: https://www.webforum.nu/p/2026542

## #16 — Inferis, 2007-09-08T18:05Z

Nu är det NULL som sparas. Men är din kod mycket mindre prestandakrävande? Verkar ju nästan som samma princip.

Detta är tänkt att köras som en .vbs med Schemaläggaren i Windows.
Ska man ta bort Server.CreateObject och byta mot bara CreateObject? Funkar fso i .vbs?

Permalänk: https://www.webforum.nu/p/2026558

## #17 — colione, 2007-09-08T18:23Z

Ja och ja, på dina frågor. :)

Permalänk: https://www.webforum.nu/p/2026565

## #18 — Inferis, 2007-09-08T18:54Z

> **colione skrev:**
>
> Ja och ja, på dina frågor. :)

Vilka av frågorna?

Permalänk: https://www.webforum.nu/p/2026576

## #19 — colione, 2007-09-08T18:55Z

Förlåt. Denna

> Ska man ta bort Server.CreateObject och byta mot bara CreateObject? Funkar fso i .vbs?

Permalänk: https://www.webforum.nu/p/2026578

## #20 — Inferis, 2007-09-08T18:57Z

Ok. Tack!

Permalänk: https://www.webforum.nu/p/2026579

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/164264-subdate
