01/01/2009 tarihim varsa, günün hangi gün olduğunu öğrenmek istiyorum, örneğin Pazartesi, Salı, vb ...
SQL Server 2005/2008'de bunun için yerleşik bir işlev var mı? Veya yardımcı bir tablo kullanmam gerekir mi?
01/01/2009 tarihim varsa, günün hangi gün olduğunu öğrenmek istiyorum, örneğin Pazartesi, Salı, vb ...
SQL Server 2005/2008'de bunun için yerleşik bir işlev var mı? Veya yardımcı bir tablo kullanmam gerekir mi?
Yanıtlar:
DATENAME
Veya kullanın DATEPART
:
SELECT DATENAME(dw,GETDATE()) -- Friday
SELECT DATEPART(dw,GETDATE()) -- 6
SQLMenace'in yanıtı kabul edilmiş olsa da, SET
bilmeniz gereken önemli bir seçenek var
DATENAME doğru tarih adını döndürür, ancak haftanın ilk günü aşağıda gösterildiği gibi değiştirilirse aynı DATEPART değerini döndürmez .
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
. Pazar her zaman sıfır olacaktır.
DayOfWeek
numaralandırmasının DayOfWeek.Sunday
... değerine sahip olmasıdır 0
. Bu nedenle, ne DateFirst
ayarlanırsa yapılsın, işlenmemiş bir SQL döndürülen WEEKDAY
değer asla .NET karşılığıyla uyumlu olmayacaktır. 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())
Belirli bir tarih için haftanın günü için deterministik bir değer elde etmek için DATEPART () ve @@ datefirst kombinasyonunu kullanabilirsiniz . Aksi takdirde sunucudaki ayarlara bağımlı olursunuz.
Daha iyi bir çözüm için aşağıdaki siteye göz atın: MS SQL: Haftanın Günü
Daha sonra haftanın günü 0 ila 6 aralığında olacaktır, burada 0 Pazar, 1 Pazartesi'dir, vb. Daha sonra doğru hafta içi adını döndürmek için basit bir vaka ifadesi kullanabilirsiniz.
AVRUPA:
declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);
SQL Server 2012 ile ve ileriye kullanabilirsiniz FORMAT
işlevi
SELECT FORMAT(GETDATE(), 'dddd')
Bu benim kod çalışma kopyasını kontrol edin, sql gün tarihinden nasıl yeniden
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
Güvenmek @@DATEFIRST
veya kullanmak istemiyorsanız DATEPART(weekday, DateColumn)
, haftanın gününü kendiniz hesaplayın.
Pazartesi günleri (Avrupa) için en basit olanı:
SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay
Pazar günleri (Amerika) için şunları kullanın:
SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay
Bu, 1 Ocak'tan bu yana hafta içi sayıyı (1-7) sırasıyla 7, 1753'te verir.
DATEPART(dw, GETDATE())
Sonucun @@DATEFIRST
haftanın ilk günü ayarı olan SQL Server ayar değerine bağlı olacağını da kullanabilirsiniz (Avrupa'da, Pazar olan varsayılan değer 7'dir).
Haftanın ilk gününü başka bir değere değiştirmek istiyorsanız, SET DATEFIRST
ancak bu, sorgu oturumunuzda istemediğiniz her yeri etkileyebilir.
Alternatif yol, haftanın ilk gün değerini parametre olarak açıkça belirtmek ve @@DATEFIRST
ayara bağlı olarak kaçınmaktır . İhtiyaç duyduğunuzda bunu elde etmek için aşağıdaki formülü kullanabilirsiniz:
(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1
@WeekStartDay
sisteminiz için haftanın ilk günü nerede (1'den 7'ye, yani Pazartesi'den Pazar'a).
Kolayca tekrar kullanabilmemiz için aşağıdaki fonksiyona sardım:
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
Örnek kullanım:
GetDayInWeek('2019-02-04 00:00:00', 1)
Aşağıdakine eşdeğerdir (ancak SQL Server DATEFIRST ayarından bağımsızdır):
SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')
Bu sürümü faydalı bulabilirsiniz.
-- 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