Jeśli mam datę 01.01.2009, chcę dowiedzieć się, który to był dzień, np. Poniedziałek, wtorek itp.
Czy jest w tym wbudowana funkcja SQL Server 2005/2008? Czy też muszę użyć stołu pomocniczego?
Jeśli mam datę 01.01.2009, chcę dowiedzieć się, który to był dzień, np. Poniedziałek, wtorek itp.
Czy jest w tym wbudowana funkcja SQL Server 2005/2008? Czy też muszę użyć stołu pomocniczego?
Odpowiedzi:
SELECT DATENAME(dw,GETDATE()) -- Friday
SELECT DATEPART(dw,GETDATE()) -- 6
Mimo że odpowiedź SQLMenace została zaakceptowana, jest jedna ważna SET
opcja, o której powinieneś wiedzieć
DATENAME zwróci poprawną nazwę daty, ale nie tę samą wartość DATEPART, jeśli pierwszy dzień tygodnia został zmieniony, jak pokazano poniżej.
declare @DefaultDateFirst int
set @DefaultDateFirst = @@datefirst
--; 7 First day of week is "Sunday" by default
select [@DefaultDateFirst] = @DefaultDateFirst
set datefirst @DefaultDateFirst
select datename(dw,getdate()) -- Saturday
select datepart(dw,getdate()) -- 7
--; Set the first day of week to * TUESDAY *
--; (some people start their week on Tuesdays...)
set datefirst 2
select datename(dw,getdate()) -- Saturday
--; Returns 5 because Saturday is the 5th day since Tuesday.
--; Tue 1, Wed 2, Th 3, Fri 4, Sat 5
select datepart(dw,getdate()) -- 5 <-- It's not 7!
set datefirst @DefaultDateFirst
( @@datefirst - 1 + datepart(weekday, thedate) ) % 7
. Niedziela będzie zawsze zero.
DayOfWeek
wyliczenie ma DayOfWeek.Sunday
o wartości ... 0
. Tak więc, bez względu na to, co DateFirst
zostanie ustawione, nieprzetworzonaWEEKDAY
wartość zwrócona przez SQL nigdy nie będzie zgodna z odpowiednikiem .NET. Yay, Microsoft.
SELECT CASE DATEPART(WEEKDAY,GETDATE())
WHEN 1 THEN 'SUNDAY'
WHEN 2 THEN 'MONDAY'
WHEN 3 THEN 'TUESDAY'
WHEN 4 THEN 'WEDNESDAY'
WHEN 5 THEN 'THURSDAY'
WHEN 6 THEN 'FRIDAY'
WHEN 7 THEN 'SATURDAY'
END
select datename(dw,getdate())
Aby uzyskać wartość deterministyczną dla dnia tygodnia dla danej daty, można użyć kombinacji DATEPART () i @@ datefirst . W przeciwnym razie zależy to od ustawień na serwerze.
Sprawdź lepsze strony: MS SQL: Dzień tygodnia
Dzień tygodnia będzie wtedy w zakresie od 0 do 6, gdzie 0 to niedziela, 1 to poniedziałek itp. Następnie możesz użyć prostej instrukcji przypadku, aby zwrócić poprawną nazwę dnia tygodnia.
EUROPA:
declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);
Z SQL Server 2012 i nowszymi możesz korzystać z tej FORMAT
funkcji
SELECT FORMAT(GETDATE(), 'dddd')
to jest kopia robocza mojego kodu sprawdź, jak pobrać nazwę dnia od daty w sql
CREATE Procedure [dbo].[proc_GetProjectDeploymentTimeSheetData]
@FromDate date,
@ToDate date
As
Begin
select p.ProjectName + ' ( ' + st.Time +' '+'-'+' '+et.Time +' )' as ProjectDeatils,
datename(dw,pts.StartDate) as 'Day'
from
ProjectTimeSheet pts
join Projects p on pts.ProjectID=p.ID
join Timing st on pts.StartTimingId=st.Id
join Timing et on pts.EndTimingId=et.Id
where pts.StartDate >= @FromDate
and pts.StartDate <= @ToDate
END
Jeśli nie chcesz polegać @@DATEFIRST
lub używać DATEPART(weekday, DateColumn)
, po prostu sam oblicz dzień tygodnia.
Dla tygodni opartych na poniedziałku (Europa) najprostszym jest:
SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay
W przypadku niedzielnych tygodni (Ameryka) użyj:
SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay
Zwraca liczbę dni tygodnia (od 1 do 7) od 1 stycznia odpowiednio 7, 1753.
Możesz użyć, DATEPART(dw, GETDATE())
ale pamiętaj, że wynik będzie zależał od @@DATEFIRST
wartości ustawienia serwera SQL, która jest ustawieniem pierwszego dnia tygodnia (w Europie wartość domyślna 7, czyli niedziela).
Jeśli chcesz zmienić pierwszy dzień tygodnia na inną wartość, możesz użyć SET DATEFIRST
tej opcji, ale może to wpłynąć na wszędzie w sesji zapytania, których nie chcesz.
Alternatywnym sposobem jest jawne określenie wartości pierwszego dnia tygodnia jako parametru i unikanie tego w zależności od @@DATEFIRST
ustawienia. W razie potrzeby możesz użyć następującej formuły:
(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1
gdzie @WeekStartDay
jest pierwszy dzień tygodnia, jaki chcesz dla swojego systemu (od 1 do 7, co oznacza od poniedziałku do niedzieli).
Zawinąłem go w funkcję poniżej, abyśmy mogli go łatwo ponownie użyć:
CREATE FUNCTION [dbo].[GetDayInWeek](@InputDateTime DATETIME, @WeekStartDay INT)
RETURNS INT
AS
BEGIN
--Note: @WeekStartDay is number from [1 - 7] which is from Monday to Sunday
RETURN (DATEPART(dw, @InputDateTime) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1
END
Przykładowe użycie:
GetDayInWeek('2019-02-04 00:00:00', 1)
Jest to równoważne z następującymi (ale niezależnymi od ustawienia DATEFIRST serwera SQL):
SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')
Ta wersja może być przydatna.
-- Test DATA
select @@datefirst
create table #test (datum datetime)
insert #test values ('2013-01-01')
insert #test values ('2013-01-02')
insert #test values ('2013-01-03')
insert #test values ('2013-01-04')
insert #test values ('2013-01-05')
insert #test values ('2013-01-06')
insert #test values ('2013-01-07')
insert #test values ('2013-01-08')
-- Test DATA
select Substring('Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun,Mon,Tue,Wed,Thu,Fri,Sat',
(DATEPART(WEEKDAY,datum)+@@datefirst-1)*4+1,3),Datum
from #test