Sql 获取当月的星期几(第二个星期二等)
我需要一个算法来计算一个月内每周的天数。如每月第一个星期五、每月第三个星期一等) 欢迎提出任何意见 以下是最终结果:Sql 获取当月的星期几(第二个星期二等),sql,sql-server,tsql,Sql,Sql Server,Tsql,我需要一个算法来计算一个月内每周的天数。如每月第一个星期五、每月第三个星期一等) 欢迎提出任何意见 以下是最终结果: declare @dt date = GetDate() declare @DayOfWeek tinyint = datepart(weekday,@dt) declare @DayOfMonth smallint = day(@dt) declare @FirstDayOfMonth date = dateadd(month,datediff(month,0,@dt),0
declare @dt date = GetDate()
declare @DayOfWeek tinyint = datepart(weekday,@dt)
declare @DayOfMonth smallint = day(@dt)
declare @FirstDayOfMonth date = dateadd(month,datediff(month,0,@dt),0)
declare @DayOfWeekInMonth tinyint = @DayOfMonth / 7 + 1 -
(case when day(@FirstDayOfMonth) > day(@dt) then 1 else 0 end)
declare @Suffix varchar(2) =
case
when @DayOfWeekInMonth = 1 then 'st'
when @DayOfWeekInMonth = 2 then 'nd'
when @DayOfWeekInMonth = 3 then 'rd'
when @DayOfWeekInMonth > 3 then 'th'
end
select
cast(@DayOfWeekInMonth as varchar(2))
+ @Suffix
+ ' '
+ datename(weekday,@Dt)
+ ' of '
+ datename(month,@dt)
+ ', '
+ datename(year,@Dt)
PS:如果您能想出更好的方法来说明问题,请这样做。以下代码将为您提供2014年4月1日星期三的
SELECT cast((DATEPART(d, GETDATE() - 1) / 7) + 1 as varchar(12))
+ 'st ' + DATENAME(WEEKDAY, getdate()) + ' of ' +
DATENAME(month, getdate()) + ' ' + DATENAME(year, getdate());
对于任何日期,请使用下面的代码。对于示例中的@mydate='2014-04-29'
,它给出了2014年4月第5个星期二的:
DECLARE @mydate DATETIME;
SET @mydate = '2014-04-29';
SELECT
case
when DATEPART(d, @mydate) = 1 then cast((DATEPART(d, @mydate ) / 7) + 1 as varchar(12))
else cast((DATEPART(d, @mydate - 1) / 7) + 1 as varchar(12))
end
+
case
when (DATEPART(d, @mydate - 1) / 7) + 1 = 1 then 'st '
when (DATEPART(d, @mydate - 1) / 7) + 1 = 2 then 'nd '
when (DATEPART(d, @mydate - 1) / 7) + 1 = 3 then 'rd '
else 'th '
end
+ DATENAME(WEEKDAY, @mydate) + ' of ' +
DATENAME(month, @mydate) + ' ' + DATENAME(year, @mydate) as [Long Date Name]
好的,我的图恩
请给我的答案打分,这是代码:
declare @v_month nvarchar(2) = '04'
,@v_annee nvarchar(4) = '2014'
declare @v_date date = convert(date,@v_annee+'-'+@v_month+'-01')
declare @v_date_2 date = dateadd(M,1,@v_date)
if OBJECT_ID('temp') is not null
drop table temp
create table temp(_date date, _DayOfMonth nvarchar(20), _order int)
while (@v_date<@v_date_2)
begin
set @v_date =@v_date;
WITH _DayOfWeek AS (
SELECT 1 id, 'monday' Name UNION ALL
SELECT 2 id, 'tuesday' Name UNION ALL
SELECT 3 id, 'wednesday' Name UNION ALL
SELECT 4 id, 'thursday' Name UNION ALL
SELECT 5 id, 'friday' Name UNION ALL
SELECT 6 id, 'saturday' Name UNION ALL
SELECT 7 id, 'sunday' Name)
insert into temp(_date,_DayOfMonth)
SELECT
@v_date
,(select Name from _DayOfWeek where id = DATEPART(WEEKDAY,@v_date))
SET @v_date = DATEADD(DAY,1,@v_date)
END
UPDATE tmp1
SET _order = _order_2
FROM temp tmp1
INNER JOIN
(SELECT *, ROW_NUMBER() OVER(PARTITION BY _DayOfMonth ORDER BY _date ASC) AS _order_2 FROM temp) tmp2
ON tmp1._date = tmp2._date
SELECT * FROM temp
SELECT *
FROM temp
WHERE _DayOfMonth = 'thursday'
AND _order = 3
声明@v_month nvarchar(2)='04'
,@v_annee nvarchar(4)=“2014”
声明@v_date date=convert(日期@v_annee+'-'+@v_month+'-01')
声明@v_date_2 date=dateadd(M,1,@v_date)
如果对象ID('temp')不为空
升降台温度
创建表格温度(_datedate,_dayofMonthNVARCHAR(20),_orderint)
虽然(@v_date好的,下面是我的想法,我将+1所有回答的人:
declare @dt date = GetDate()
declare @DayOfWeek tinyint = datepart(weekday,@dt)
declare @DayOfMonth smallint = day(@dt)
declare @FirstDayOfMonth date = dateadd(month,datediff(month,0,@dt),0)
declare @DayOfWeekInMonth tinyint =
@DayOfMonth / 7 + 1
- (case when day(@FirstDayOfMonth) > day(@dt) then 1 else 0 end)
declare @Suffix varchar(2) =
case
when @DayOfWeekInMonth = 1 then 'st'
when @DayOfWeekInMonth = 2 then 'nd'
when @DayOfWeekInMonth = 3 then 'rd'
when @DayOfWeekInMonth > 3 then 'th'
end
select
cast(@DayOfWeekInMonth as varchar(2))
+ @Suffix
+ ' '
+ datename(weekday,@Dt)
+ ' of '
+ datename(month,@dt)
+ ', '
+ datename(year,@Dt)
结果是一个单选(前提是@dt的赋值发生在前面),但基本上与您的逻辑相同。以下代码将为您指定的任何月份或年份的一周中的任何一天提供日期。我所拥有的所有变量都是为了减少重复逻辑以提高代码速度
此代码为您提供2013年2月第一个星期一的日期
DECLARE @DayNumber INT = 1
,@DayWeekNumber INT = 2
,@MonthNumber INT = 2
,@YearNumber INT = 2013
,@FoM DATE
,@FoMWD INT;
SET @FoM = DATEFROMPARTS(@YearNumber,@MonthNumber,1)
SET @fomwd = DATEPART(WEEKDAY, @FoM);
SELECT CASE WHEN @fomwd = @DayWeekNumber THEN DATEADD(WEEK, @DayNumber - 1, @FoM)
WHEN @fomwd < @DayWeekNumber THEN DATEADD(DAY, @DayWeekNumber - @fomwd, DATEADD(WEEK, @DayNumber - 1, @FoM))
WHEN @fomwd > @DayWeekNumber THEN DATEADD(DAY, @DayWeekNumber - @fomwd, DATEADD(WEEK, @DayNumber, @FoM))
END AS DateOfDay;
DECLARE@DayNumber INT=1
,@DayWeekNumber INT=2
,@MonthNumber INT=2
,@Underumber INT=2013
,@FoM日期
,@FoMWD INT;
设置@FoM=DATEFROMPARTS(@DreamNumber,@MonthNumber,1)
设置@fomwd=DATEPART(工作日,@FoM);
选择@fomwd=@DayWeekNumber然后是DATEADD时的情况(周,@DayNumber-1,@FoM)
当@fomwd<@DayWeekNumber然后是DATEADD时(DAY,@DayWeekNumber-@fomwd,DATEADD(WEEK,@DayNumber-1,@FoM))
当@fomwd>@DayWeekNumber之后是DATEADD(天、@DayWeekNumber-@fomwd、DATEADD(周、@DayNumber、@FoM))
以DateOfDay结束;
为什么要在sql中执行此操作?到目前为止,您尝试了哪些操作?哪些操作对您有效,哪些操作无效?在sql中执行此操作是一项我无法更改的要求。它需要成为存储过程的一部分,将行添加到日期维度表中,并由sql Server代理每年运行一次,以填充下一年。哦,我正在处理它。我就是这么想的我想其他人也会喜欢的。第二、第三、第四类的附件呢?它可以工作,但对于这个值无效SET@mydate=getdate()-1;
需要稍微调整,但你得到了积分。看我的答案。对我来说有点太复杂了。解决方案可以简单得多。+1用于尝试。Binaya的——冗余度最好。你用浮点来做这件事?这算什么?哇,伙计。你肯定喜欢打字!我真正需要的是每月7日+1和当一个月开始的一周中的某一天在一周中的当前一天之后时,调整它。当你可以用一个datepart获得该周中的某一天的数字时,为什么要用七个IFs来获得该周中的某一天的数字?以及所有这些参数?只是,哇…如果你想使用该天的名称而不是数字,那么7IF
语句就是case。我也不是不是基于当前日期而是基于传入的参数,这样做是为了将它存储在进程或函数中,可以根据您想要的任何内容返回数据类型,而不仅仅是今天的情况。传递参数所需的只是一个日期。所需的任何内容都可以从中获得。我实现它的方式是,它是一个t取一个日期并返回DayOfWeekInMonth。@然后告诉我什么是1997年11月的第4个星期四
你不能,因为你依赖于提供给你的日期来计算它是什么。我的是从另一方完成的,以便根据你的请求提供日期基础。
DECLARE @dt DATETIME
SET @dt = DATEADD(d, 6, GETDATE())
SELECT @dt,
CAST((DAY(@dt) / 7) + CASE WHEN DATEPART(weekday, @dt) >= DATEPART(weekday, CAST(MONTH(@dt) AS NVARCHAR) + '/01/' + CAST(YEAR(@dt) AS NVARCHAR)) THEN 1 ELSE 0 END AS NVARCHAR)
+ '' + CASE (DAY(@dt) / 7) + CASE WHEN DATEPART(weekday, @dt) >= DATEPART(weekday, CAST(MONTH(@dt) AS NVARCHAR) + '/01/' + CAST(YEAR(@dt) AS NVARCHAR)) THEN 1 ELSE 0 END
WHEN 1 THEN N'st'
WHEN 2 THEN N'nd'
WHEN 3 THEN N'rd'
ELSE N'th'
END
+ ' ' + DATENAME(dw, @dt)
+ ' of ' + DATENAME(M, @dt)
+ ', ' + CAST(YEAR(@dt) AS NVARCHAR)
DECLARE @DayNumber INT = 1
,@DayWeekNumber INT = 2
,@MonthNumber INT = 2
,@YearNumber INT = 2013
,@FoM DATE
,@FoMWD INT;
SET @FoM = DATEFROMPARTS(@YearNumber,@MonthNumber,1)
SET @fomwd = DATEPART(WEEKDAY, @FoM);
SELECT CASE WHEN @fomwd = @DayWeekNumber THEN DATEADD(WEEK, @DayNumber - 1, @FoM)
WHEN @fomwd < @DayWeekNumber THEN DATEADD(DAY, @DayWeekNumber - @fomwd, DATEADD(WEEK, @DayNumber - 1, @FoM))
WHEN @fomwd > @DayWeekNumber THEN DATEADD(DAY, @DayWeekNumber - @fomwd, DATEADD(WEEK, @DayNumber, @FoM))
END AS DateOfDay;