Nếu tôi có một ngày 01/01/2009, tôi muốn tìm hiểu ngày nào là ngày thứ Hai, thứ Ba, v.v ...
Có chức năng tích hợp sẵn cho việc này trong SQL Server 2005/2008 không? Hay tôi cần sử dụng bảng phụ?
Nếu tôi có một ngày 01/01/2009, tôi muốn tìm hiểu ngày nào là ngày thứ Hai, thứ Ba, v.v ...
Có chức năng tích hợp sẵn cho việc này trong SQL Server 2005/2008 không? Hay tôi cần sử dụng bảng phụ?
Câu trả lời:
Sử dụng DATENAME
hoặc DATEPART
:
SELECT DATENAME(dw,GETDATE()) -- Friday
SELECT DATEPART(dw,GETDATE()) -- 6
Mặc dù câu trả lời của SQLMenace đã được chấp nhận, có một SET
tùy chọn quan trọng bạn nên biết
DATENAME sẽ trả về tên ngày chính xác nhưng không phải cùng giá trị DATEPART nếu ngày đầu tuần đã được thay đổi như minh họa bên dưới.
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
. Chủ nhật sẽ luôn là con số không.
DayOfWeek
liệt kê có DayOfWeek.Sunday
với giá trị ... 0
. Vì vậy, bất kể điều gì DateFirst
được giải quyết, một giá trị trả về SQL không được xử lýWEEKDAY
sẽ không bao giờ tương thích với đối tác .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())
Để có được giá trị xác định cho ngày trong tuần cho một ngày nhất định, bạn có thể sử dụng kết hợp giữa DATEPART () và @@ datefirst . Nếu không, bạn phụ thuộc vào các cài đặt trên máy chủ.
Kiểm tra trang web sau để có giải pháp tốt hơn: MS SQL: Ngày trong tuần
Ngày trong tuần sau đó sẽ nằm trong phạm vi 0 đến 6, trong đó 0 là Chủ nhật, 1 là Thứ Hai, v.v. Sau đó, bạn có thể sử dụng một câu lệnh tình huống đơn giản để trả về tên ngày trong tuần chính xác.
CHÂU ÂU:
declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);
Với SQL Server 2012 trở đi, bạn có thể sử dụng FORMAT
chức năng
SELECT FORMAT(GETDATE(), 'dddd')
đây là bản sao làm việc của mã của tôi, hãy kiểm tra nó, làm thế nào để lấy lại tên ngày từ ngày trong 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
Nếu bạn không muốn phụ thuộc @@DATEFIRST
hoặc sử dụng DATEPART(weekday, DateColumn)
, chỉ cần tính toán ngày trong tuần.
Trong tuần thứ hai (Châu Âu) đơn giản nhất là:
SELECT DATEDIFF(day, '17530101', DateColumn) % 7 + 1 AS MondayBasedDay
Đối với tuần chủ nhật (Mỹ) sử dụng:
SELECT DATEDIFF(day, '17530107', DateColumn) % 7 + 1 AS SundayBasedDay
Điều này trả về số ngày trong tuần (1 đến 7) kể từ ngày 1 tháng 1 tương ứng ngày 7, 1753.
Bạn có thể sử dụng DATEPART(dw, GETDATE())
nhưng lưu ý rằng kết quả sẽ dựa trên @@DATEFIRST
giá trị cài đặt máy chủ SQL là cài đặt ngày đầu tuần (Ở châu Âu giá trị mặc định 7 là Chủ nhật).
Nếu bạn muốn thay đổi ngày đầu tuần sang giá trị khác, bạn có thể sử dụng SET DATEFIRST
nhưng điều này có thể ảnh hưởng đến mọi nơi trong phiên truy vấn mà bạn không muốn.
Cách khác là xác định rõ ràng giá trị ngày đầu tiên của tuần làm tham số và tránh tùy thuộc vào @@DATEFIRST
cài đặt. Bạn có thể sử dụng công thức sau để đạt được điều đó khi cần:
(DATEPART(dw, GETDATE()) + @@DATEFIRST + 6 - @WeekStartDay) % 7 + 1
đâu @WeekStartDay
là ngày đầu tiên trong tuần bạn muốn cho hệ thống của mình (từ 1 đến 7, nghĩa là từ thứ Hai đến Chủ nhật).
Tôi đã gói nó vào chức năng dưới đây để chúng ta có thể tái sử dụng nó một cách dễ dàng:
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
Ví dụ sử dụng:
GetDayInWeek('2019-02-04 00:00:00', 1)
Nó tương đương với sau (nhưng độc lập với cài đặt DATEFIRST của máy chủ SQL):
SET DATEFIRST 1
DATEPART(dw, '2019-02-04 00:00:00')
Bạn có thể tìm thấy phiên bản này hữu ích.
-- 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