Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SET DATEFIRST in FUNCTION

I want to SET DATEFIRST in my function but it is not allowed.

SET DATEFIRST 1

I can add the code in a SP and call the SP from the function but I am not keen on doing that.

I can SET the DATEFIRST before I call my function but I am not keen on doing that as well.

Any other work around?

EDIT

Below is the code I want to use in my FUNCTION to return the total working days of the month. But I cant add this code into the FUNCTION because of my DATEFIRST

DECLARE @my int
DECLARE @myDeduct int
DECLARE @day INT
DECLARE @mydate DATETIME
DECLARE @TotalDays INT

SET @mydate = GETDATE()

SET @myDeduct = 0
IF (@@DATEFIRST + DATEPART(DW, @mydate)) % 7 not in (0,1)
SET DateFirst 1 -- Set it monday=1 (value)

--Saturday and Sunday on the first and last day of a month will Deduct 1
IF (DATEPART(weekday,(DATEADD(dd,-(DAY(@mydate)-1),@mydate))) > 5)
SET @myDeduct = @myDeduct + 1

IF (DATEPART(weekday,(DATEADD(dd,-(DAY(DATEADD(mm,1,@mydate))),DATEADD(mm,1,@mydate)))) > 5)
SET @myDeduct = @myDeduct + 1

SET @my = day(DATEADD(dd,-(DAY(DATEADD(mm,1,@mydate))),DATEADD(mm,1,@mydate)))

Set @TotalDays = (select (((@my/7) * 5 + (@my%7)) - @myDeduct))

Select @TotalDays
like image 967
Etienne Avatar asked Sep 19 '12 06:09

Etienne


People also ask

What is set Datefirst?

The SET DATEFIRST function is used to set the first day of the week from number 1-7. In order to know the current first day of the week, @@DATEFIRST is used.

What is @@ Datefirst?

@@DATEFIRST (Transact-SQL)This function returns the current value of SET DATEFIRST, for a specific session. See Date and Time Data Types and Functions (Transact-SQL) for an overview of all Transact-SQL date and time data types and functions.

Is there a day function in SQL?

SQL Server DAY() Function The DAY() function returns the day of the month (from 1 to 31) for a specified date.

How do I get day of week in SQL?

MySQL DAYOFWEEK() Function The DAYOFWEEK() function returns the weekday index for a given date (a number from 1 to 7). Note: 1=Sunday, 2=Monday, 3=Tuesday, 4=Wednesday, 5=Thursday, 6=Friday, 7=Saturday.


2 Answers

Instead of

SET DATEFIRST 1

You can do

SELECT (DATEPART(weekday, GETDATE()) + @@DATEFIRST - 2) % 7 + 1
like image 124
Kvasi Avatar answered Sep 23 '22 04:09

Kvasi


My usual workaround is to use "known-good" dates for my comparisons.

Say, for instance, that I need to check that a date is a saturday. Rather than relying on DATEFIRST or language settings (for using DATENAME), I instead say:

DATEPART(weekday,DateToCheck) = DATEPART(weekday,'20120714')

I know that 14th July 2012 was a Saturday, so I've performed the check without relying on any external settings.


The expression (DATEPART(weekday,DateToCheck) + @@DATEFIRST) % 7 will always produce the value 0 for Saturday, 1 for Sunday, 2 for Monday, etc.

So, I'd advise you to create a table:

CREATE TABLE WorkingDays (
    NormalisedDay int not null,
    DaysInMonth int not null,
    WorkingDays int not null
)

Populating this table is a one off exercise. NormalisedDay would be the value computed by the expression I've given above.

To compute the DaysInMonth given a particular date, you can use the expression:

DATEDIFF(day,
      DATEADD(month,DATEDIFF(month,0,DateToCheck),0),
      DATEADD(month,DATEDIFF(month,'20010101',DateToCheck),'20010201'))

Now all your function has to do is look up the value in the table.

(Of course, all of the rows where DaysInMonth is 28 will have 20 as their result. It's only the rows for 29,30 and 31 which need a little work to produce)

like image 29
Damien_The_Unbeliever Avatar answered Sep 22 '22 04:09

Damien_The_Unbeliever