หากฉันมีวันที่ 01/01/2552 ฉันต้องการทราบว่าเป็นวันอะไรวันจันทร์อังคาร ฯลฯ
มีฟังก์ชันในตัวสำหรับสิ่งนี้ใน SQL Server 2005/2008 หรือไม่ หรือฉันจำเป็นต้องใช้ตารางเสริม?
หากฉันมีวันที่ 01/01/2552 ฉันต้องการทราบว่าเป็นวันอะไรวันจันทร์อังคาร ฯลฯ
มีฟังก์ชันในตัวสำหรับสิ่งนี้ใน SQL Server 2005/2008 หรือไม่ หรือฉันจำเป็นต้องใช้ตารางเสริม?
คำตอบ:
แม้ว่าคำตอบของ SQLMenace นั้นได้รับการยอมรับ แต่ก็มีSET
ตัวเลือกที่สำคัญอย่างหนึ่งที่คุณควรระวัง
DATENAMEจะส่งคืนชื่อวันที่ที่ถูกต้องแต่จะไม่เป็นค่าDATEPARTเดียวกันหากวันแรกของสัปดาห์มีการเปลี่ยนแปลงตามที่แสดงด้านล่าง
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
คงที่คุณทำ วันอาทิตย์จะเป็นศูนย์เสมอ
DayOfWeek
การแจงนับมีDayOfWeek.Sunday
มีมูลค่า 0
... ดังนั้นไม่ว่าสิ่งที่กำหนดไว้ค่าที่ส่งคืน SQL ที่ไม่ได้รับDateFirst
การรักษาWEEKDAY
จะไม่เข้ากันได้กับ. 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())
เพื่อให้ได้ค่าที่กำหนดสำหรับวันของสัปดาห์สำหรับวันที่กำหนดคุณสามารถใช้การรวมกันของDATEPART ()และ@@ datefirst มิฉะนั้นคุณต้องพึ่งพาการตั้งค่าบนเซิร์ฟเวอร์
ลองดูเว็บไซต์ต่อไปนี้เพื่อดูคำตอบที่ดีกว่า: MS SQL: วันของสัปดาห์
วันของสัปดาห์จะอยู่ในช่วง 0 ถึง 6 โดยที่ 0 คือวันอาทิตย์, 1 คือวันจันทร์, ฯลฯ จากนั้นคุณสามารถใช้คำสั่งกรณีง่าย ๆ เพื่อส่งคืนชื่อวันทำงานที่ถูกต้อง
ยุโรป:
declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);
ด้วย SQL Server 2012 เป็นต้นไปคุณสามารถใช้FORMAT
ฟังก์ชันนี้ได้
SELECT FORMAT(GETDATE(), 'dddd')
นี่เป็นสำเนาที่ใช้งานได้ของรหัสของฉันตรวจสอบวิธีการกู้คืนชื่อวันจากวันที่ใน 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
หากคุณไม่ต้องการพึ่งพา@@DATEFIRST
หรือใช้งานDATEPART(weekday, DateColumn)
ให้คำนวณวันของสัปดาห์ด้วยตัวคุณเอง
สำหรับสัปดาห์ตามวันจันทร์ (ยุโรป) ที่ง่ายที่สุดคือ:
SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay
สำหรับการใช้งานในสัปดาห์วันอาทิตย์ (อเมริกา):
SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay
ส่งคืนหมายเลขวันทำงาน (1 ถึง 7) นับตั้งแต่วันที่ 1 มกราคมตามลำดับที่ 7, 1753
คุณสามารถใช้DATEPART(dw, GETDATE())
แต่ระวังว่าผลลัพธ์จะขึ้นอยู่กับการตั้งค่าเซิร์ฟเวอร์ SQL @@DATEFIRST
ซึ่งเป็นวันแรกของการตั้งค่าสัปดาห์ (ในยุโรปค่าเริ่มต้น 7 ซึ่งเป็นวันอาทิตย์)
หากคุณต้องการเปลี่ยนวันแรกของสัปดาห์เป็นค่าอื่นคุณสามารถใช้SET DATEFIRST
แต่สิ่งนี้อาจส่งผลกระทบทุกที่ในเซสชันการสืบค้นที่คุณไม่ต้องการ
ทางเลือกคือการระบุค่าวันแรกของสัปดาห์อย่างชัดเจนเป็นพารามิเตอร์และหลีกเลี่ยงขึ้นอยู่กับ@@DATEFIRST
การตั้งค่า คุณสามารถใช้สูตรต่อไปนี้เพื่อให้บรรลุผลเมื่อต้องการ:
(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1
ซึ่ง@WeekStartDay
เป็นวันแรกของสัปดาห์ที่คุณต้องการสำหรับระบบของคุณ (1-7 ซึ่งหมายความว่าตั้งแต่วันจันทร์ถึงวันอาทิตย์)
ฉันได้ห่อมันไว้ข้างล่างฟังก์ชั่นเพื่อให้เราสามารถนำมาใช้ใหม่ได้อย่างง่ายดาย:
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
ตัวอย่างการใช้งาน:
GetDayInWeek('2019-02-04 00:00:00', 1)
เทียบเท่ากับการติดตาม (แต่ไม่ขึ้นอยู่กับการตั้งค่า DATEFIRST ของเซิร์ฟเวอร์ SQL):
SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')
คุณอาจพบว่ารุ่นนี้มีประโยชน์
-- 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