SQL конвертировать даты в название дня недели - PullRequest
0 голосов
/ 15 мая 2018

Я работаю в SQL Server, и у меня есть такая таблица:

My Table

Чего я пытаюсь достичь;Я пытаюсь сопоставить список наиболее частых выходных больных.Мне нужно преобразовать столбец [Sick Leave Start Date] в день недели.У меня нет проблем с достижением этого с помощью DATENAME(day, GETDATE()).

Это работает для получения дня недели, когда пользователь впервые заболел - однако, когда [Всего выходных дней] больше 1, мне нужно перебирать каждыйвведите дату и сохраните название дня.

Так что я стремлюсь достичь чего-то подобного следующему;

desired results

Любые указатели будут оченьоценили!

Ответы [ 5 ]

0 голосов
/ 15 мая 2018

Я поместил некоторые случайные данные во временную таблицу, чтобы написать это:

select CAST(v.startDate as datetime) startDate, CAST(v.duration as int) duration
into ##leave
from (values('2018-05-15','9'),('2018-03-21','10'),('2018-01-12','5'),('2017-12-24','1'),('2017-11-25','10'),('2017-11-09','2'),('2017-09-28','2'),('2017-07-29','2'),('2017-05-18','1'),('2017-02-24','9'),('2016-11-28','4'),('2016-08-27','4'))v(startDate,duration)
;
declare @maxLeaveLen integer = (select MAX(duration) from ##leave)
;
with ml as (
    select 1 n
    union all
    select n + 1 from ml
    where n + 1 <= @maxLeaveLen
), sd as ( 
    select DATENAME(weekday, DATEADD(day, ml.n - 1, l.startDate)) [weekday]
    from ml ml
        cross join ##leave l
    where ml.n <= l.duration
) select sd.weekday, COUNT(1)
  from sd
  group by sd.weekday
0 голосов
/ 15 мая 2018

основываясь на моем понимании, я пытался сделать этот запрос, я надеюсь, что его работы и костюм основаны на том, что вы ищете

SELECT T1.LEAVE_START_DAY, SUM(TOTAL_DAY_OFF) AS FREQUENCY
FROM
  (Select 
    DATENAME(DAY, START_DATE) AS LEAVE_START_DAY,
    TOTAL_DAY_OFF
  FROM TableLeave) T1
GROUP BY T1.LEAVE_START_DAY
0 голосов
/ 15 мая 2018

Сначала сгенерируйте диапазоны дат вашего заболевания, затем присоединитесь к календарной таблице (здесь я создаю одну рекурсивно) и сгруппируйте по названию каждого дня.

;WITH RecursiveCalendar AS
(
    SELECT
        GeneratedDate = CONVERT(DATE, '2018-01-01')

    UNION ALL

    SELECT
        GeneratedDate = DATEADD(DAY, 1, C.GeneratedDate)
    FROM
        RecursiveCalendar AS C
    WHERE
        C.GeneratedDate < '2019-01-01'
),
SickRanges AS
(
    SELECT
        S.StartDate,
        EndDate = DATEADD(DAY, CEILING(S.DaysOff) - 1, S.StartDate)
    FROM
        YourTable AS S
)
SELECT
    Weekday = DATENAME(WEEKDAY, C.GeneratedDate),
    AmountSickDays = COUNT(1)
FROM
    SickRanges AS R
    INNER JOIN RecursiveCalendar AS C ON C.GeneratedDate BETWEEN R.StartDate AND R.EndDate
GROUP BY
    DATENAME(WEEKDAY, C.GeneratedDate)
ORDER BY
    COUNT(1) DESC
OPTION
    (MAXRECURSION 30000)

Замените свою таблицу и столбец на втором CTE для запуска.

0 голосов
/ 15 мая 2018

enter image description here

IF OBJECT_ID('tempdb..#temp_DAYS_SICK') IS NOT NULL DROP TABLE #temp_DAYS_SICK
  CREATE TABLE #TEMP_DAYS_SICK
  (
  DAYWEEK VARCHAR(25)
  )
  DECLARE @DATE DATE,@TARGETDATE DATE,@OFFSET INT
  SET @OFFSET = 25
  SET @DATE = GETDATE()
  SET @TARGETDATE = DATEADD(DD,@OFFSET,@DATE)
  WHILE(@DATE <> @TARGETDATE)
  BEGIN
  INSERT INTO #TEMP_DAYS_SICK
  SELECT DATENAME(DW,@DATE)
  SET @DATE = DATEADD(DD,1,@DATE)
  END

  SELECT DAYWEEK,COUNT(1) AS DAYS_SICK FROM #TEMP_DAYS_SICK GROUP BY DAYWEEK
0 голосов
/ 15 мая 2018

Я понимаю, что вы пытаетесь получить название дня, когда общее количество выходных превышает 1. Попробуйте это ...

select DATENAME(DW, DATEADD(day, TotalDaysOff, SickLeaveStartDate)) as SickDay 
from [table_name] where 
TotalDaysOff > 1

Для Марка этого может быть достаточно:

select DATENAME(DW, DATEADD(day, TotalDaysOff, SickLeaveStartDate)) + ', ' + 
DATENAME(DW, DATEADD(day, (TotalDaysOff-1), SickLeaveStartDate)) as SickDay 
from [table_name] where 
TotalDaysOff > 1

Однако вы можете ограничить декремент (TotalDaysOff-1), чтобы он не создавал отрицательного значения. Причина, которая повлияет на результат и может не работать должным образом.

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