webForumDet fria alternativet

Ta ut tider före 08:00 och tider efter 20:00 samt alla tider på helger.

Databaser & SQL

9 svar · 1 358 visningar · startad av devotion

Medlem sedan jan. 20013 582 inlägg
Frågan#1

Hej! :)

Om jag har en tabell som innehåller StartTime och StopTime (yyyy-mm-dd hh:mm:ss)

Hur gör jag för att få ut alla poster som har StartTime före 08:00 eller StopTime efter 20:00 + alla tider på helger (lör, sön)

Mvh
Henrik

Medlem sedan dec. 19995 874 inlägg
#2

Menar du ungefär såhär?

select * from #temp 
where 
	(DATEPART(hh, startdate) < 8 or DATEPART(hh, stopdate) > 20)
	or (DATENAME(dw, startdate) in ('Saturday', 'Sunday') 
		or DATENAME(dw, stopdate) in ('Saturday', 'Sunday')
	)

Om du kör sql-server 2008 kan du istället använda timekolumnen och göra något i stil med.

select * from mytimetable
where 
	(starttime < '08:00' or stoptime > '20:00')
	or (DATENAME(dw, stopdate) in ('Saturday', 'Sunday') 
		or DATENAME(dw, stopdate) in ('Saturday', 'Sunday')
	)

Alltså att du delar upp datum och tid i två olika kolumner.

Jag visste inte heller om du ville gå på startdate eller stopdate när helgkollen skall göras.

Medlem sedan jan. 20013 582 inlägg
#3

Funkar finfint! (y)

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#4

Hej igen!

Hur ändrar man villkoret till detta:

Ta med alla tider som hänför sig till innan 08:00 (även med stopptid efter 08:00) och alla tider efter 20:00 (även med starttid innan 20:00) samt alla tider lördagar och söndagar.
Morgontid som startar 08:00 vill jag ha med. Även utesluta stopptid 20:00 men ta med tider > 20:00.

Mvh
Henrik :)

Medlem sedan jan. 20013 582 inlägg
#5

Ingen? :)

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#6

Please...

:)

Mvh
Henrik

Medlem sedan maj 2000144 inlägg
#7

devotion skrev:

Hej igen!

Hur ändrar man villkoret till detta:

Ta med alla tider som hänför sig till innan 08:00 (även med stopptid efter 08:00) och alla tider efter 20:00 (även med starttid innan 20:00) samt alla tider lördagar och söndagar.
Morgontid som startar 08:00 vill jag ha med. Även utesluta stopptid 20:00 men ta med tider > 20:00.

Mvh
Henrik :)

Om jag har försått villkoret rätt så bör följande funka (sql server 2008)

1. Alla tider som startar innan kl. 08:00
2. Alla tider som slutar efter kl. 20:00
3. Alla tider på helger

Tar även med dem som böjar på kvällen och slutar på morgonen.

select * from mytimetable
where cast(starttime as time) < '08:00' or cast(stoptime as time) > '20:00'
or DATENAME(dw, starttime) in ('Saturday', 'Sunday') 
or DATENAME(dw, stoptime) in ('Saturday', 'Sunday') 
or DATEPART(d, starttime) <> DATEPART(d, stoptime)
Medlem sedan jan. 20013 582 inlägg
#8

adde2 skrev:

Om jag har försått villkoret rätt så bör följande funka (sql server 2008)

1. Alla tider som startar innan kl. 08:00
2. Alla tider som slutar efter kl. 20:00
3. Alla tider på helger

Tar även med dem som böjar på kvällen och slutar på morgonen.

select * from mytimetable
where cast(starttime as time) < '08:00' or cast(stoptime as time) > '20:00'
or DATENAME(dw, starttime) in ('Saturday', 'Sunday') 
or DATENAME(dw, stoptime) in ('Saturday', 'Sunday') 
or DATEPART(d, starttime) <> DATEPART(d, stoptime)

Hej,

Tack!

Jag skall testa detta!

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#9

Hej igen!

Har testat:

select 
	DATENAME(dw, startDate) + ' / ' + Convert(varChar(5), startDate, 108) AS [Start (Dag/tid)], 
	DATENAME(dw, stopDate) + ' / ' + Convert(varChar(5), stopDate, 108) AS [Stopp (Dag/tid)]
from tblTime
where (DATEPART(hh, startdate) <= 8 or DATEPART(hh, stopdate) > 20)
	or DATENAME(dw, startdate) in ('Saturday', 'Sunday') 
	or DATENAME(dw, stopdate) in ('Saturday', 'Sunday') 
	or DATEPART(d, startdate) <> DATEPART(d, stopdate)

/*
Ta med alla tider som hänför sig till innan/eller 08:00 (även med stopptid efter 08:00) 
och alla tider efter 20:00 (även med starttid innan 20:00) 
samt alla tider lördagar och söndagar.
Morgontid som startar 08:00 vill jag ha med. 
Även utesluta stopptid 20:00 men ta med tider > 20:00.

1. Alla tider som startar innan kl. 08:00 eller kl 08:00 ( <= 8)
2. Alla tider som slutar efter kl. 20:00
3. Alla tider på helger

*/

Nu kör jag SQL 2005, vilket gör att jag inte har tillgång till time?

Det blir ju 'nästan' rätt. Men en tid som börjar 08:50, tas ju med, vilket den inte skall göra. Endast tider innan 08:00 eller tider 08:00 prick, skall tas med.
(se bild)
Kan man lösa det i SQL 2005?

Mvh
Henrik

sql.png
Medlem sedan dec. 20025 483 inlägg
#10
...
where
    DATEPART(hh, startdate) < 8 
    or (DATEPART(hh, startdate) = 8 and DATEPART(mi, startdate) = 0)
    or DATEPART(hh, stopdate) > 20)
    or DATENAME(dw, startdate) in ('Saturday', 'Sunday') 
    or DATENAME(dw, stopdate) in ('Saturday', 'Sunday') 
    or DATEPART(d, startdate) <> DATEPART(d, stopdate)
270 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
143 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)