【问题标题】:Convert Week Number to First day of Week将周数转换为一周的第一天
【发布时间】:2016-08-02 15:35:26
【问题描述】:

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

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

感谢您的帮助!

【问题讨论】:

  • 我添加了 sql-server 标签,因为它看起来很像 SQL Server 代码。
  • 你有日期表吗?
  • 这个问题解决了吗?您需要进一步的帮助吗?请给我一个提示:如果您在最佳答案的投票柜台下方勾选接受检查,那就太好了。这将 1) 将此问题标记为已解决 2) 让追随者更容易找到最佳解决方案 3) 向回答者支付积分和 4) 向您支付积分。一旦您自己越过 15 点边界,您 - 另外 - 被要求对贡献进行投票。这是说谢谢的方式。快乐编码!

标签: sql sql-server date week-number


【解决方案1】:

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

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

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

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

结果始终是给定日期之前的星期日。在末尾添加+2,您将获得星期一。

更新

您可能希望将结果转换为 DATE 以摆脱时间组件...

【讨论】:

    【解决方案2】:

    您可以使用以下序列生成和聚合 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 2021-07-21
      • 2021-01-11
      相关资源
      最近更新 更多