[MSSQL] Gevolgen van DATEFIRST veranderen in syslanguages?

Pagina: 1
Acties:
  • 351 views sinds 30-01-2008

  • Riegstar
  • Registratie: Februari 2003
  • Niet online

Riegstar

Wadapatja!

Topicstarter
Ik heb het volgende probleem:

Ik heb een functie ISOyear en ISOweek gemaakt die van een gegeven DateTime de juiste iso-jaar en iso-week terug geeft.
ISOyear('2005-01-01') geeft 2004
ISOweek('2005-01-01') geeft 53

Maar, dit werkt alleen wanneer de week begint op maandag.

Bij een STOREDPROC is dat geen probleem, je zet bovenaan gewoon:
SET DATEFIRST 1

Maar dat mag niet in een VIEW of een FUNCTION.

Nu is de vraag of het mogelijk is om de datefirst over de gehele database op 1 te zetten.

Ik heb wel iets gevonden en dat is de default-language te veranderen van English naar Dutch.
Maar dan veranderd de dateformat ook en dat wil ik niet. En bovendien verander je niet zomaar de default-language van een productie-database.

Een andere optie zou kunnen zijn is handmatig de datefirst kolom in de syslanguages-tabel te veranderen van 7 in 1 voor de huidige taal (English)

Ik weet niet wat de gevolgen zijn over de gehele database als ik deze setting verander.
Kan dit zomaar of is nog een andere oplossing?

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

/edit: Laat maar... Ik lees weer niet goed. Onderstaande heb je dus ook niet veel aan.
excuses 8)7
Riegstar schreef op donderdag 10 februari 2005 @ 12:15:
Een andere optie zou kunnen zijn is handmatig de datefirst kolom in de syslanguages-tabel te veranderen van 7 in 1 voor de huidige taal (English)

Ik weet niet wat de gevolgen zijn over de gehele database als ik deze setting verander.
Kan dit zomaar of is nog een andere oplossing?
Ik ken de gevolgen ook niet, maar over het algemeen wordt rechtstreeks editen van de systables afgeraden. Een ad hoc query (select) kan nog wel, maar update? brrrr ;)

Misschien kan je hier wat inspiratie uit halen (quote van msdn)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE FUNCTION ISOweek  (@DATE datetime)
RETURNS int
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

[ Voor 35% gewijzigd door Annie op 10-02-2005 13:14 ]

Today's subliminal thought is:


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ik zal even voor hem antwoorden, ik weet er nl. ook iets van :P

Deze functie is bekend, en we gebruiken hem ook in wat aangepaste vorm. Probleem is echter dat het resultataat van de functie afhankelijk is van de DATEFIRST setting. Wij rekenen met maandag als eerste dag van de week, terwijl de (engelse) standaard uit gaat van 7. Deze waarde 7 staat in de master.dbo.syslanguages tabel en is te wijzigen met de SET DATEFIRST functie. Het probleem is echter dat die functie niet in een view op function gebruikt kan worden.

We hebben dus de volgende opties

• Default language van de database op nederlands zetten
• Met een system sp de language van de ingelogde user op nederlands zetten
• De standaard waarde van DATEFIRST voor de taal Engels op 1 zetten

De laatste optie spreekt ons het meest aan omdat die geen andere taalafhankelijke instellingen om zeep helpt. Echter, de enige mogelijkheid is volgens ons het wijzigen van die waarde in de syslanguages tabel.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Riegstar
  • Registratie: Februari 2003
  • Niet online

Riegstar

Wadapatja!

Topicstarter
Sorry voor het kleine schopje.

We hebben even afgewacht op reacties voordat we werkelijk de default-waarde van DATEFIRST van 7 naar 1 gaan veranderen.

Voor zover ik weet zou deze verandering alleen gevolgen hebben voor de aan DATEPART gerelateerde funties.

Als ik daar rekening mee houd, kan ik dan ongestraft de DATEFIRST in de syslanguages wijzigen?
Of zijn er nog andere addertjes onder het gras?

Acties:
  • 0 Henk 'm!

Verwijderd

Ik gebruik een eigen weekfunctie, die onafhankelijk van @@datefirst werkt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Create Function Week (@Date datetime)
    Returns int
As
/*
Week function Created by Aknot/PD 17 septemper 2002.

Calculates the week number of a given date, according to ISO 8601 
(the week belongs to the year of the Thursday)
*/
Begin
    Declare @Week int
    Set @Week = Null
    
    If (@Date Is Not Null)
    Begin
        Declare @DayOfWeek int, @DayOfYear int
        
        /* Get the day of the week, where Monday = day 1. This means taking into account
        the value of @@DATEFIRST which may be something else than Monday. (Set DATEFIRST
        is not allowed in a function).*/
        Set @DayOfWeek = DatePart(dw, @Date) + (@@DATEFIRST - 1)
        If (@DayOfWeek > 7) Set @DayOfWeek = @DayOfWeek - 7
    
        /* Get the Thursday of the specified week */
        Set @Date = DateAdd(d, 4 - @DayOfWeek, @Date) 
        
        /* Get the number of days in the year up and including the 
        Wednesday of the week */
        Set @DayOfYear = DatePart(dy, @Date) - 1
        /* Calculate the whole number of weeks (integer division!) */
        Set @Week = (@DayOfYear / 7) + 1
    End
    Return @Week
End


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Create Function WeekYear (@Date datetime)
    Returns int
As
/*
WeekYear function created by Aknot/PD 17 septemper 2002.

Calculates the year belonging to the week number of a given date, according to ISO 8601. 
Example: the WeekYear for 2001/12/31 is 2002, because 2001/12/31 is week 1 of 2002.
*/
Begin
    Declare @WeekYear int
    Set @WeekYear = Null
    
    If (@Date Is Not Null)
    Begin
        Declare @DayOfWeek int
        
        /* Get the day of the week, where Monday = day 1. This means taking into account
        the value of @@DATEFIRST which may be something else than Monday. (Set DATEFIRST
        is not allowed in a function).*/
        Set @DayOfWeek = DatePart(dw, @Date) + (@@DATEFIRST - 1)
        If (@DayOfWeek > 7) Set @DayOfWeek = @DayOfWeek - 7
    
        /* Get the Thursday of the specified week */
        Set @Date = DateAdd(d, 4 - @DayOfWeek, @Date) 
        
        /* The week number always belongs to the year of the Thursday */
        Set @WeekYear = Year(@Date)
    End
    Return @WeekYear
End

Acties:
  • 0 Henk 'm!

  • Riegstar
  • Registratie: Februari 2003
  • Niet online

Riegstar

Wadapatja!

Topicstarter
Kijk eens aan. Dit is een hele andere benadering van de ISOweek problematiek.
Jou functie lijkt sneller als de vaak genoemde functie van msdn. (geen recursie enzo)

Zal direct testen.

Acties:
  • 0 Henk 'm!

  • Robvk
  • Registratie: Augustus 2021
  • Laatst online: 16-10-2023
Verwijderd schreef op vrijdag 25 februari 2005 @ 02:09:
Ik gebruik een eigen weekfunctie, die onafhankelijk van @@datefirst werkt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Create Function Week (@Date datetime)
    Returns int
As
/*
Week function Created by Aknot/PD 17 septemper 2002.

Calculates the week number of a given date, according to ISO 8601 
(the week belongs to the year of the Thursday)
*/
Begin
    Declare @Week int
    Set @Week = Null
    
    If (@Date Is Not Null)
    Begin
        Declare @DayOfWeek int, @DayOfYear int
        
        /* Get the day of the week, where Monday = day 1. This means taking into account
        the value of @@DATEFIRST which may be something else than Monday. (Set DATEFIRST
        is not allowed in a function).*/
        Set @DayOfWeek = DatePart(dw, @Date) + (@@DATEFIRST - 1)
        If (@DayOfWeek > 7) Set @DayOfWeek = @DayOfWeek - 7
    
        /* Get the Thursday of the specified week */
        Set @Date = DateAdd(d, 4 - @DayOfWeek, @Date) 
        
        /* Get the number of days in the year up and including the 
        Wednesday of the week */
        Set @DayOfYear = DatePart(dy, @Date) - 1
        /* Calculate the whole number of weeks (integer division!) */
        Set @Week = (@DayOfYear / 7) + 1
    End
    Return @Week
End


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Create Function WeekYear (@Date datetime)
    Returns int
As
/*
WeekYear function created by Aknot/PD 17 septemper 2002.

Calculates the year belonging to the week number of a given date, according to ISO 8601. 
Example: the WeekYear for 2001/12/31 is 2002, because 2001/12/31 is week 1 of 2002.
*/
Begin
    Declare @WeekYear int
    Set @WeekYear = Null
    
    If (@Date Is Not Null)
    Begin
        Declare @DayOfWeek int
        
        /* Get the day of the week, where Monday = day 1. This means taking into account
        the value of @@DATEFIRST which may be something else than Monday. (Set DATEFIRST
        is not allowed in a function).*/
        Set @DayOfWeek = DatePart(dw, @Date) + (@@DATEFIRST - 1)
        If (@DayOfWeek > 7) Set @DayOfWeek = @DayOfWeek - 7
    
        /* Get the Thursday of the specified week */
        Set @Date = DateAdd(d, 4 - @DayOfWeek, @Date) 
        
        /* The week number always belongs to the year of the Thursday */
        Set @WeekYear = Year(@Date)
    End
    Return @WeekYear
End
17 jaar na datum, nog steeds nuttig. Dank!

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Robvk schreef op woensdag 12 oktober 2022 @ 16:22:
[...]


17 jaar na datum, nog steeds nuttig. Dank!
Heel tof dat je iemand bedankt, maar een topic omhoogschoppen voor zo'n klenigheidje is hier niet de bedoeling ;) Die waarschuwing staat er dan ook niet voor niets:
Let op! De laatste reactie in deze discussie is meer dan 2 weken oud!

[ Voor 39% gewijzigd door RobIII op 12-10-2022 16:31 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1

Dit topic is gesloten.