如何在sql中以行的形式在给定的日期列中查找月份的星期一

如何在sql中以行的形式在给定的日期列中查找月份的星期一,sql,sql-server,tsql,sql-server-2008,ssms,Sql,Sql Server,Tsql,Sql Server 2008,Ssms,这些都是十月的星期一,我希望它能动态运行。如果能对Mon、Tue、Wed只做同样的操作就更好了,最后一列应该是sum[如excel工作表中所示] 从中选择客户名称、工作名称、工作时间[2018-09-03]、[2018-09-10]、[2018-09-17]、[2018-09-24] 从StaleFileReport中选择ClientName、JobName、JobTime、convertdate、reporttime、101作为[ReportDate],其中convertvarchar、rep

这些都是十月的星期一,我希望它能动态运行。如果能对Mon、Tue、Wed只做同样的操作就更好了,最后一列应该是sum[如excel工作表中所示]

从中选择客户名称、工作名称、工作时间[2018-09-03]、[2018-09-10]、[2018-09-17]、[2018-09-24] 从StaleFileReport中选择ClientName、JobName、JobTime、convertdate、reporttime、101作为[ReportDate],其中convertvarchar、reporttime、102在“2018.09.03”、“2018.09.10”、“2018.09.17”、“2018.09.24”中 按ClientName、JobName、JobTime、convertdate、reporttime、101x分组 支点 计数[报告日期] [2018-09-03]、[2018-09-10]、[2018-09-17]、[2018-09-24]中的[报告日期] AS P


您可以使用如下脚本:

DECLARE @PassedInDate AS DATE;

SET @PassedInDate = GETDATE();

WITH    CTE ( N )
          AS (
               SELECT   1
               FROM     ( VALUES ( 1), ( 1), ( 1), ( 1), ( 1), ( 1), ( 1), ( 1), ( 1) ) a ( N )
               ),
        CTE2 ( N )
          AS (
               SELECT   0 -- 0 based
               UNION ALL
               SELECT TOP 30 -- limit it up front, never more than 31 days in a month!
                        ROW_NUMBER() OVER ( ORDER BY (SELECT   NULL) )
               FROM     CTE a
               CROSS JOIN CTE b
             ),
        CTE3 ( N )
          AS (
               SELECT   DATEADD(DAY, N, DATEADD(MONTH, DATEDIFF(MONTH, 1, @PassedInDate), 0))
               FROM     CTE2
               WHERE    DATEADD(DAY, N, DATEADD(MONTH, DATEDIFF(MONTH, 1, @PassedInDate), 0)) < 
                        DATEADD(MONTH, DATEDIFF(MONTH, 1, @PassedInDate) + 1, 0)
             )
SELECT  N AS [DATE]
FROM    CTE3
WHERE DATENAME(WEEKDAY, N) = 'Monday';

参考:

您可以使用如下脚本:

DECLARE @PassedInDate AS DATE;

SET @PassedInDate = GETDATE();

WITH    CTE ( N )
          AS (
               SELECT   1
               FROM     ( VALUES ( 1), ( 1), ( 1), ( 1), ( 1), ( 1), ( 1), ( 1), ( 1) ) a ( N )
               ),
        CTE2 ( N )
          AS (
               SELECT   0 -- 0 based
               UNION ALL
               SELECT TOP 30 -- limit it up front, never more than 31 days in a month!
                        ROW_NUMBER() OVER ( ORDER BY (SELECT   NULL) )
               FROM     CTE a
               CROSS JOIN CTE b
             ),
        CTE3 ( N )
          AS (
               SELECT   DATEADD(DAY, N, DATEADD(MONTH, DATEDIFF(MONTH, 1, @PassedInDate), 0))
               FROM     CTE2
               WHERE    DATEADD(DAY, N, DATEADD(MONTH, DATEDIFF(MONTH, 1, @PassedInDate), 0)) < 
                        DATEADD(MONTH, DATEDIFF(MONTH, 1, @PassedInDate) + 1, 0)
             )
SELECT  N AS [DATE]
FROM    CTE3
WHERE DATENAME(WEEKDAY, N) = 'Monday';

Ref:

使用WITH命令进行设置,您可以将其添加到SQLquery中,然后在查询中使用日期表

DECLARE @AdayOfMonth as date = '2018.10.01';   --any date in the month you want
WITH DAYS AS (SELECT 0 AS D UNION ALL SELECT D + 1 FROM DAYS WHERE D < 30),
    PD AS (
          SELECT DATEADD(day,
                         DAYS.D,
                         dateadd(day,1- DAY(@AdayOfMonth),@AdayOfMonth)) t FROM DAYS
          ),
    AD AS (
           SELECT * FROM PD where MONTH(PD.t) = 
                                         MONTH(@AdayOfMonth) 
                                                   AND DATENAME(dw,PD.t) = 'monday'
          )
    SELECT * FROM AD;   --your query in place of this simple select

使用WITH命令进行设置,可以将其添加到SQLquery中,然后在查询中使用日期表

DECLARE @AdayOfMonth as date = '2018.10.01';   --any date in the month you want
WITH DAYS AS (SELECT 0 AS D UNION ALL SELECT D + 1 FROM DAYS WHERE D < 30),
    PD AS (
          SELECT DATEADD(day,
                         DAYS.D,
                         dateadd(day,1- DAY(@AdayOfMonth),@AdayOfMonth)) t FROM DAYS
          ),
    AD AS (
           SELECT * FROM PD where MONTH(PD.t) = 
                                         MONTH(@AdayOfMonth) 
                                                   AND DATENAME(dw,PD.t) = 'monday'
          )
    SELECT * FROM AD;   --your query in place of this simple select

请编辑您的问题,并将SQL查询作为文本而不是屏幕截图插入。谢谢!欢迎使用SO。您正在寻找的函数是DATEPART。您好,欢迎使用SO。这是一个很好的起点。欢迎使用堆栈溢出。首先,请不要标记不相关的RDBMS。Oracle和SQL Server是完全不同的产品;图片清晰SSMS的y,那么为什么要标记Oracle?发布数据和代码时,不要将其作为图像发布。将其作为文本发布。请编辑您的问题,并将SQL查询作为文本而不是屏幕截图插入。谢谢!欢迎使用so。您要找的函数是DATEPART。您好,欢迎使用so。这是一个很好的起点。欢迎使用堆栈溢出。首先,请不要标记不相关的RDBMS。Oracle和SQL Server是完全不同的产品;图片上清楚地显示了SSM,那么为什么要标记Oracle?发布数据和代码时,不要将其作为图像发布。将其作为文本发布。