Just nu i M3-nätverket
Gå till innehåll

Välj inlägg mellan 2 datum


Christoph

Rekommendera Poster

Hej,

 

jag har hand om en MS-SQL-db med en tabell som innehåller två fält "date_" och "time_". Jag försöker nu filtrera bort alla inlägg som _inte_ är skapade mellan två tidspunkter, låt säger den 28:e augusti 2004 kl. 06:30:00 och den 30:e augusti 2004 kl. 09:02:00.

 

Skriver jag så här,

 

[color="#0000ff"]SELECT[/color]     *
[color="#0000ff"]FROM[/color]         RecHead
[color="#0000ff"]WHERE[/color]     (Date_ >= CONVERT(DATETIME, [color="#ff0000"]'2004-08-28 00:00:00'[/color], 102)) [color="#0000ff"]AND[/color] (Time_ >= CONVERT(DATETIME, [color="#ff0000"]'1900-01-01 06:30:00'[/color], 102)) [color="#0000ff"]AND[/color] 
                      (Date_ <= CONVERT(DATETIME, [color="#ff0000"]'2004-08-30 00:00:00'[/color], 102)) [color="#0000ff"]AND[/color] (Time_ <= CONVERT(DATETIME, [color="#ff0000"]'1900-01-01 09:02:00'[/color], 102))

 

hittas det inga inlägg alls. Någon som vet vad problemet är? Det finns inlägg i databasen.

 

Tacksam för all hjälp.

 

/C.

 

Länk till kommentar
Dela på andra webbplatser

Nu är jag ju ingen expert på MS SQL Server, men jag ska försöka komma med några tips ändå.

 

För det första undrar jag varför du har två kolumner för att spara ETT VÄRDE (på en tidpunkt)? I standard SQL används datatypen TIMESTAMP. (Ej att förväxla med SQL Servers datatyp med motsvarande namn som inte alls har något med saken att göra.)

 

Ifall du ni inte vill slå ihop de två kolumnerna till en kolumn kan du kanske skapa en vy som returnerar datat med date_ och time_ ihopslaget.

 

Jämför därefter hela värdet med de gränser du vill ha:

 

[color="#0000ff"]SELECT[/color] * [color="#0000ff"]FROM[/color] tabellen
[color="#0000ff"]WHERE[/color] date_time [color="#0000ff"]BETWEEN[/color] [color="#ff0000"]'2004-08-28 06:30:00'[/color] [color="#0000ff"]AND[/color]
                                         [color="#ff0000"]'2004-08-30 09:02:00'[/color]

eller (ifall du envisas med att ha två kolumner):

 

[color="#0000ff"]SELECT[/color] * [color="#0000ff"]FROM[/color] tabellen
[color="#0000ff"]WHERE[/color] date || time [color="#0000ff"]BETWEEN[/color] [color="#ff0000"]'2004-08-28 06:30:00'[/color] [color="#0000ff"]AND[/color]
                                            [color="#ff0000"]'2004-08-30 09:02:00'[/color]

 

Eftersom du kör MS SQL Server behöver du antagligen lägga in lite CONVERT och sådant för att det ska fungera. || i exemplet ovan står för den delen för CONCAT, alltså strängihopslagning.

 

Länk till kommentar
Dela på andra webbplatser

Hej,

 

tack för ditt svar. Jag kan mycket väl förstår att du tycker att det är konstig med att spara datum och tid i två olika kolumner. Anledningen till detta är att databasen används av ett stort program som används i restaurangbranschen, databasen fanns alltså innan jag tog itu med detta. Eftersom ett antal kassor använder sig av databasen är det lika bra att man låta det vara som det är, jag kan i detta läge bara acceptera detta märkligt sätt att spara datum och tid.

 

Ditt förslag funkade tyvärr inte, jag fick inget grepp om att slå ihop date_ och time_ till en och samma resultat. Det kan beror på att både date_ och time_ är av typen "datetime". Sparas det en tid sparas tiden (i time_) alltid med värdet "1900-01-01 06:30:00" (ex: kl. är 06:30). Datumet sparas låledes med "2004-08-28 00:00:00" (ex: datumet är 28:e augusti).

 

Någon som vet vad man kan göra åt detta?

 

/C.

 

Länk till kommentar
Dela på andra webbplatser

Du får väl trixa lite med substring och eventuellt även convert eller cast. Typ något i stil med:

 

SELECT * FROM tabellen

WHERE SUBSTRING(date_ FROM 1 for 11) ||

SUBSTRING(time_ FROM 12 for 8)

BETWEEN '2004-08-28 06:30:00'

AND '2004-08-30 09:02:00'

 

Länk till kommentar
Dela på andra webbplatser

Du får väl trixa lite med substring och eventuellt även convert eller cast.

 

Använd DATEPART ( datepart , date ) istället. Med den funktionen kan du få ut de delar du vill.

 

 

 

Länk till kommentar
Dela på andra webbplatser

Det låter bra detta, tack för all hjälp hittills - skall pröva detta a.s.a.p.

 

Jag undrar dock varför inte mitt exempel längst upp här visade rätt resultat? Någon som vet?!

 

/Christoph

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...