Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 获取当月的星期几(第二个星期二等)_Sql_Sql Server_Tsql - Fatal编程技术网

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来获得该周中的某一天的数字?以及所有这些参数?只是,哇…如果你想使用该天的名称而不是数字,那么7
IF
语句就是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;