繁体   English   中英

将周数转换为周的第一天

[英]Convert Week Number to First day of Week

我有一个包含日期的列的表。 我的目标是按星期分组,使用一周的第一天(星期一)。 目前,我只按星期编号进行分组,我无法弄清楚如何将周数转换为星期开始日期。 当前代码:

SELECT 
        DATEPART(week, CONVERT_TIMEZONE('UTC', 'America/Denver', fact_completed_offer_engagements.verified)) AS "fact_completed_offer_engagements.verified_date",
        COUNT(DISTINCT CASE WHEN fact_completed_offer_engagements.activated IS NOT NULL THEN fact_completed_offer_engagements.customer_offer_id ELSE NULL END) AS "fact_completed_offer_engagements.shopping_list_placements"
FROM public.fact_completed_offer_engagements AS fact_completed_offer_engagements
LEFT JOIN public.offers AS offers ON fact_completed_offer_engagements.offer_id = offers.id
LEFT JOIN public.campaigns AS campaigns ON offers.campaign_id = campaigns.id
LEFT JOIN public.contracts AS contracts ON campaigns.contract_id = contracts.id

  WHERE 
    (campaigns.id = ?)
                OR campaigns.id = ?
group by 1
ORDER BY 1
limit 1000

谢谢你的帮助!

你可以看看这里: https//stackoverflow.com/a/38601630/5089204

请注意,您正在使用特定于文化的逻辑。 一周的第一天是星期一,但不是到处都是......

使用@@DATEFIRST计算这样的文化独立日期

DECLARE @testDate DATETIME=GETDATE();
SELECT @testDate - (@@DATEFIRST + DATEPART(WEEKDAY,@testDate)) % 7 + 1; 

结果总是在给定日期之前的星期日。 最后添加+2 ,你将获得星期一。

UPDATE

您可能希望将结果DATEDATE以摆脱时间组件...

您可以使用以下序列生成和聚合CTE计算周开始日期。 只需在周数上加入您的查询,并根据您的要求更改开始日期。

-- Set fist day of week as Monday
SET DATEFIRST 1;

;WITH CTE_Nums AS (
              SELECT    ROW_NUMBER() OVER (ORDER BY ob.object_id) AS Num
              FROM      sys.all_objects AS ob
             ),
CTE_WeekBegin AS (
SELECT DATEPART(WEEK, DATEADD(DAY, Num, '2016-01-01')) AS WeekNo, MIN(DATEADD(DAY, Num, '2016-01-01')) AS Date
FROM CTE_Nums
GROUP BY DATEPART(WEEK, DATEADD(DAY, Num, '2016-01-01'))
)
SELECT wb.Date, ...
FROM ...
INNER JOIN CTE_WeekBegin wb ON wb.WeekNo = xx.xx;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM