Как найти понедельники месяца в столбце данных в виде строки в SQL - PullRequest
0 голосов
/ 31 октября 2018

Это все даты понедельника октября, я хочу, чтобы это происходило динамически. Было бы лучше, если бы можно было сделать то же самое только для Mon, Tue, Wed, а последний столбец должен быть sum [Как показано в таблице Excel

выберите ClientName, JobName, JobTime, [2018-09-03], [2018-09-10], [2018-09-17], [2018-09-24] из (выберите ClientName, JobName, JobTime, преобразовать (дата, время отчета, 101) как [ReportDate] из StaleFileReport, где преобразовать (varchar, ReportTime, 102) в ('2018.09.03', '2018.09.10', '2018.09.17' , '2018.09.24') группировать по ClientName, JobName, JobTime, конвертировать (дата, время отчета, 101)) x PIVOT ( Count ([ReportDate]) FOR [ReportDate] в ([2018-09-03], [2018-09-10], [2018-09-17], [2018-09-24]) ) AS P

https://i.stack.imgur.com/5aECo.png https://i.stack.imgur.com/Cgu7A.png

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Настройте его с помощью команды 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

Ваш запрос будет включать

...IN(SELECT T FROM AD)
0 голосов
/ 31 октября 2018

Вы можете использовать скрипт как ниже:

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';

Ссылка: https://www.sqlservercentral.com/Forums/Topic1654075-391-1.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...