Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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_Date_Datetime - Fatal编程技术网

按自定义每周时间范围划分的SQL组记录

按自定义每周时间范围划分的SQL组记录,sql,sql-server,date,datetime,Sql,Sql Server,Date,Datetime,这可能很简单,但我一直在思考我的问题 我需要在2018年1月至3月的某个日期范围内提取周日下午12点到周五下午1点之间的所有记录。按周分组 SELECT col1, Sum(col2) FROM (SELECT * FROM (SELECT col1, col2, Datename(dw, [date_col]) AS day_of_week,

这可能很简单,但我一直在思考我的问题

我需要在2018年1月至3月的某个日期范围内提取周日下午12点到周五下午1点之间的所有记录。按周分组

SELECT col1, 
       Sum(col2) 
FROM   (SELECT * 
        FROM   (SELECT col1, 
                       col2, 
                       Datename(dw, [date_col]) AS day_of_week, 
                       date_col 
                FROM   table 
                WHERE  Datename(dw, [update_date]) != 'Saturday' 
               --eliminate Saturday records 
               ) a 
        WHERE  ( Cast(update_date AS TIME) < '12:00' 
                 AND day_of_week != 'Sunday' ) 
       --eliminate Sunday records before noon 
       ) b 
WHERE  ( day_of_week != 'Friday' 
          OR Cast(update_date AS TIME) > '13:00' ) 

--eliminate Friday records after 1PM

编辑以反映DATEPARTdw的正确返回值

您可以执行该逻辑来确定在子查询的CASE语句中哪些天/小时组合有效,然后在外部查询中选择并按周数分组。这将简化WHERE子句。我发现这种风格不那么不透明,更容易长期保持

下面的示例在Microsoft SQL SERVER上进行了测试

SELECT
    DATEPART(wk, Update_Date) AS GroupByWeek
    , col1
    , SUM(col2)
FROM (
    SELECT
        col1
        , col2
        , Update_Date
        , CASE
            WHEN DATEPART(dw, Update_Date) = 1 AND DATEPART(hh, Update_Date) >= 12 THEN 1
            WHEN DATEPART(dw, Update_Date) = 6 AND DATEPART(hh, Update_Date) < 13 THEN 1
            WHEN DATEPART(dw, Update_Date) BETWEEN 2 AND 5 THEN 1
            ELSE 0
        END AS FallsInWindow
    FROM table
) RowsInWindow
WHERE 
    RowsInWindow.Update_Date BETWEEN '2018-01-01' AND '2018-04-01'
    AND RowsInWindow.FallsInWindow = 1
GROUP BY
    DATEPART(wk, Update_Date)
    , col1
ORDER BY GroupByWeek

您可以使用以下条件:

WHERE update_date >= '2018-01-01' -- between Jan 2018
AND   update_date <  '2018-04-01' -- and Mar 2018
AND (
    DATENAME(dw, update_date) = 'Sunday' AND CAST(update_date AS TIME) >= '12:00' OR
    DATENAME(dw, update_date) IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday') OR
    DATENAME(dw, update_date) = 'Friday' AND CAST(update_date AS TIME) < '13:00'
)

标记DBMS,即MySQL、SQL Server等。。示例数据最好作为+。请将您的问题包括在内,您当前的尝试和您想要的结果。有关详细信息,select@@datefirst为您提供了什么?与星期几相关的函数依赖于此。选择@@datefirst返回7@Salman,语言可以,但日期优先设置如何影响dayofweek名称?这不会按周对数据进行分组。您如何知道col1不是周?无论如何,我可以添加另一个分组。为什么需要子查询?DATEPART可以根据@DATEFIRST变量返回不同的值。@CetinBasoz-您不需要子查询。不过,我觉得这种风格更容易阅读和维护。使用子查询简化WHERE子句。子查询也可以很容易地放入一个视图中,该视图允许逻辑窗口被抽象出来,并由其他模块共享。@SalmanA-感谢您提供有关@DATEFIRST的信息。我不知道那个细节。DATEPART应该返回1到7之间的数字,而不是0到6之间的数字。我需要更正,这是我的错误。删除我的评论。
WHERE update_date >= '2018-01-01' -- between Jan 2018
AND   update_date <  '2018-04-01' -- and Mar 2018
AND (
    DATENAME(dw, update_date) = 'Sunday' AND CAST(update_date AS TIME) >= '12:00' OR
    DATENAME(dw, update_date) IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday') OR
    DATENAME(dw, update_date) = 'Friday' AND CAST(update_date AS TIME) < '13:00'
)