如果我有一个日期01/01/2009,我想找出星期几,例如星期一,星期二等。
SQL Server 2005/2008中是否对此具有内置功能?还是我需要使用辅助表?
如果我有一个日期01/01/2009,我想找出星期几,例如星期一,星期二等。
SQL Server 2005/2008中是否对此具有内置功能?还是我需要使用辅助表?
Answers:
即使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
。因此,无论DateFirst
设置为什么,未经处理的 SQL返回WEEKDAY
值都不会与.NET兼容。是的,微软。
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是星期一,依此类推。然后,您可以使用简单的case语句返回正确的工作日名称。
欧洲:
declare @d datetime;
set @d=getdate();
set @dow=((datepart(dw,@d) + @@DATEFIRST-2) % 7+1);
这是我的代码的工作副本,请检查它,如何从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
您可以使用,DATEPART(dw, GETDATE())
但请注意结果将取决于SQL Server设置@@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)
它等效于以下内容(但独立于SQL Server DATEFIRST设置):
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