Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Banal datum/veckofråga ?

Postades av 2008-11-21 08:40:39 - Christer Hedman, i forum sql-server/msde, Tråden har 15 Kommentarer och lästs av 2669 personer

Hur gör jag en jämförelse mellan innevarande vecka -4 och en vecka (int) i databasen som är skriven som 200801 till 200852, helst svensk veckonumrering. I VB är det en barnlek men jag är usel på transact sql så...


Svara

Sv: Banal datum/veckofråga ?

Postades av 2008-11-21 10:25:21 - Håkan Borneland

Kan du beskriva lite mer.
Är inte säker på vad du vill få ut. (utdata).
Hur ser det ut som du lagrat i databasen.
Vad betyder det här? "innevarande vecka -4" (Vad är -4).
Finns det någon indata eller är det statiskt?


Svara

Sv:Banal datum/veckofråga ?

Postades av 2008-11-21 11:30:05 - Christer Hedman

Jag vill göra en select-sats som bara visar poster där veckan i databasen är <= innevarande vecka minus 4 veckor.

Innevarande vecka -4 menar jag alltså fyra veckor innan nuvarande vecka (vecka 47 nu, 47-4=43 alltså vecka 43). Således, visa bara veckor <= v 43.

I databasen ligger veckan som 200801 för vecka 1 år 2008 etc.

Mitt problem är att skapa en giltig (svensk) vecka av getdate() på formatet yyyyww (och inte 20081 utan 200801 om det skulle vara vecka 1). Alternativt att skapa ett datum från databasens vecka som kan jämföras med getdate().


Svara

Sv: Banal datum/veckofråga ?

Postades av 2008-11-21 12:57:06 - Samuel Adolfsson

Du skulle kunna göra t.ex så här:

DECLARE @yw INT
DECLARE @date DATETIME

SET @date = GETDATE()
SET @yw = DATEPART(yyyy, @date) * 100 + DATEPART(wk, @date)

SELECT CAST (@yw AS VARCHAR(6))


Svara

Sv: Banal datum/veckofråga ?

Postades av 2008-11-21 13:18:39 - Håkan Borneland

Så dom poster som du ska hämta upp från databasen
och jämföra veckan mot har formatet 200801 för vecka 1.
De är då lagrade som strängar?


Svara

Sv: Banal datum/veckofråga ?

Postades av 2008-11-21 13:27:47 - Håkan Borneland

Ger ett exempel innan du svarat på min föregående fråga.
Förutsätter att du lagrat "veckodatat" (200801) som sträng.

<code>
SELECT *
FROM [min tabell]
WHERE (CAST(RIGHT([min veckokolumn], 2) AS int) = (DATEPART(ww, GETDATE()) - 4))
</code>


Svara

Sv:Banal datum/veckofråga ?

Postades av 2008-11-21 14:19:38 - Christer Hedman

Tack Samuel och Håkan, kolumnen i databasen är integer (int) som jag försökte beskriva i mitt första inlägg så jag tror Samuels lösning passar bäst.

Jag har inte fattat riktigt hur DATEPART(ww, GETDATE()) funkar med svensk veckoräkning (måndag = 1:a dag i veckan, 1:a vecka med mer är 3 dagar på året = vecka 1)

Det är ju genant att vara så usel på transact-sql när man har svart bälte i VB & VBA...


Svara

Sv: Banal datum/veckofråga ?

Postades av 2008-11-21 14:44:53 - Håkan Borneland

Kör "SELECT @@DATEFIRST" så får du till baka vilken dag som databasen betraktar som veckans första.
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
7 (default, U.S. English) Sunday

Vill du ändra detta skriver du t.ex. SET DATEFIRST 1 (Nu är måndag första dagen i veckan)


Svara

Sv: Banal datum/veckofråga ?

Postades av 2008-11-21 15:40:16 - Håkan Borneland

Tyvärr så kommer nog inte Samuels lösning att ge rätt vecka.
testa att skriva in 2005-01-01 det ger 200501 men borde ge 200553.

Det du funderar på är "ISO veckor".

Och nej det kommer att bli fel om du t.ex kör SELECT DATEPART(ww, '2005-01-01');
så får du 1 men borde få 53.


Svara

Sv:Banal datum/veckofråga ?

Postades av 2008-11-22 15:18:20 - Samuel Adolfsson

Här är en lösning som ger dig svar 53 för 2005-01-01. Jag har utgått från en C# metod som jag hittade för något år sen på webben och som jag har använt av och till för just det här, men hittar tyvärr ingen länk till den nu. Du kan få kodsnutten här på forumet om du vill det.

Här är sql-funktionen:


---- start

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

CREATE FUNCTION FindWeekNumber (@Date datetime)

RETURNS int

AS

BEGIN

DECLARE @THURSDAY INT
DECLARE @ThursdayFlag BIT
DECLARE @DayOfYear INT

SET @THURSDAY =4
SET @ThursdayFlag = 0

SET @DayOfYear = DATEPART(dayofyear,@Date)

DECLARE @DateYear INT
SET @DateYear = DATEPART(yyyy, @Date)

DECLARE @FirstDateOfCurrYear datetime
DECLARE @LastDateOfCurrYear datetime

SET @FirstDateOfCurrYear = CAST(@DateYear AS VARCHAR(10)) + '-01-01'
SET @LastDateOfCurrYear = CAST(@DateYear AS VARCHAR(10)) + '-12-31'

DECLARE @StartWeekDayOfYear INT
DECLARE @EndWeekDayOfYear INT
DECLARE @DaysInFirstWeek INT
DECLARE @DaysInLastWeek INT

SET @StartWeekDayOfYear = DATEPART(dw, @FirstDateOfCurrYear)
SET @EndWeekDayOfYear = DATEPART(dw, @LastDateOfCurrYear)

IF @StartWeekDayOfYear > 1 -- Om icke söndag
BEGIN
SET @StartWeekDayOfYear = @StartWeekDayOfYear - 1
END
ELSE -- annars om söndag
BEGIN
SET @StartWeekDayOfYear = 7
END

IF @EndWeekDayOfYear > 1 -- Om icke söndag
BEGIN
SET @EndWeekDayOfYear = @EndWeekDayOfYear - 1
END
ELSE -- annars om söndag
BEGIN
SET @EndWeekDayOfYear = 7
END
SET @DaysInFirstWeek = 8 - (@StartWeekDayOfYear );
SET @DaysInLastWeek = 8 - (@EndWeekDayOfYear );

IF @StartWeekDayOfYear = @THURSDAY OR @EndWeekDayOfYear = @THURSDAY
BEGIN
SET @ThursdayFlag = 1
END

DECLARE @FullWeeks INT
DECLARE @WeekNumber INT

SET @FullWeeks = CEILING( (@DayOfYear - @DaysInFirstWeek) / 7.0)

SET @WeekNumber = @FullWeeks

IF @DaysInFirstWeek >= @THURSDAY
BEGIN
SET @WeekNumber = @WeekNumber + 1
END

IF @WeekNumber > 52 AND @ThursdayFlag = 0
BEGIN
SET @WeekNumber = 1
END

IF @WeekNumber = 0
BEGIN
DECLARE @NewDate DATETIME
SET @NewDate = CAST(DATEPART(yyyy, @Date)-1 AS VARCHAR(10)) + '-12-31'
SET @WeekNumber = dbo.FindWeekNumber(@NewDate)
END

return @WeekNumber;

END

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO


---- slut


Svara

Sv: Banal datum/veckofråga ?

Postades av 2008-11-22 17:00:10 - Håkan Borneland

Mmmmm...
Din funktion bygger på att första dagen är Söndag (7), vilket är default för USA bla.
Har man ställt in databasen på svenska (ger måndag som första dag),
eller satt att första dagen är måndag specifikt så ger din funktion en förskjutning.
2004-12-27 ger vecka 52 men borde ge 53, 2005-01-03 ger 53 men borde ge 1.

ISO veckor bygger på att måndag är första dagen.

Här är en (kortare) funktion som utgår från att måndag är första veckan.

<code>
CREATE FUNCTION dbo.ISOweek (@DATE DATETIME)
RETURNS int
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @ISOweek int
SET @ISOweek= DATEPART(wk,@DATE)+1
-DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
--Special cases: Jan 1-3 may belong to the previous year
IF (@ISOweek=0)
SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1
AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
--Special case: Dec 29-31 may belong to the next year
IF ((DATEPART(mm,@DATE)=12) AND
((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
SET @ISOweek=1
RETURN(@ISOweek)
END;
GO
</code>


Svara

Sv:Banal datum/veckofråga ?

Postades av 2008-11-22 21:16:03 - Samuel Adolfsson

Håkan, jag får en förskjutning med din ISOweek så du har nog rätt i att det beror på vilken inställning databsen har.

Men iaf, ett bättre sätt än att räkna ut veckonummer för varje gång borde ju vara att ha en lut-tabell (förifylld x år framåt och bakåt) med mappning mellan datumintervall och veckor. T.ex

StartDate -- datetime
EndDate -- datetime
WeekNumber -- int WW
YearWeekNumber -- int YYYYWW

Då är det ju bara göra en join med den tabellen i själva frågan.


Svara

Sv: Banal datum/veckofråga ?

Postades av 2008-11-22 22:05:20 - Håkan Borneland

Ja den bygger på att du har första dagen i veckan på måndag (som nämts tidigare) som vi har i Sverige.
Den som Christer frågade efter.
Du har antagligen Engelska (7).
För att den ska fungera så ska databsen vara satt till antingen Svenska eller DATEFIRST till 1.
Alltså SET LANGUAGE Svenska; eller SET DATEFIRST 1;
Vill du veta vad du har kör SELECT @@DATEFIRST;


Svara

Sv: Banal datum/veckofråga ?

Postades av 2008-11-22 22:40:42 - Håkan Borneland

[Samuel]
Ursäkta svarade bara lite mekaniskt på det första du skrev.

Njaa kanske inte i det här fallet, men jag vet för lite hur det är tänkt att avända.
Känslan jag får är att det är en stående fråga (rapport/statistik), och att det som han efterfrågar är ett sätt att få ut dels rätt vecka (svensk) hänga på året (tillkrånglat enligt mig iaf),
och sedan att t.ex via en variabel jämföra den mot årveckokolumnen i WHERE/JOIN.
(Lite som en permanet inparameter).
Vilket kommer att vara helt ok frågemässigt.

Annars så tycker jag att lagringsformatet är tillkrånglat, vill du åt veckan spara den separat i varje post.

[SET OFFTOPIC ON]
När man använder funktioner för att plocka ut data så använder inte frågeoptimeraren index,
utan skannar hela tabellen (gäller troligtvis inte i det här fallet, se ovan).
[SET OFFTOPIC OFF]

Kan du förklara uttrycket lut-tabell, har aldrig stött på det förut.
(alltså inte vad det du skrev ovan ska göra utan uttrycket).

Ja ja... lite mer svammel en lördagskväll... :-)


Svara

Sv:Banal datum/veckofråga ?

Postades av 2008-11-23 15:07:21 - Samuel Adolfsson

LUT = Look Up Table, uttrycket används väl egentligen inte i databassammanhang.


Svara

Sv: Banal datum/veckofråga ?

Postades av 2008-11-23 17:24:52 - Håkan Borneland

Ok.
Tack för infon.

Jo just det det används, men har då bara sett lookup table inte lut.
Men man lär sig något nytt varje dag.


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 615
27 953
271 709
5 469
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies