Сгенерируйте Пропущенную дату, добавьте нулевое значение и добавьте единицу к существующей дате в sql. - PullRequest
0 голосов
/ 16 апреля 2019

Я новичок в sql, и мне нужно сгенерировать отсутствующую дату и добавить значение 0 и для существующего значения даты как 1.

ссылается на множество примеров создания отсутствующей даты в sql all show, добавляя 0 к отсутствующей дате, но нет решения добавить 1 к существующей дате

У меня есть таблица с именем Alarm и столбец Alarm_start, Alarm_Start содержит данные ниже.

2019-03-24 11:36:24.000
2019-03-25 07:47:49.000
2019-03-27 09:40:39.000
2019-03-29 10:04:43.000

нужен только результат с датой и 0 и 1

2019-03-24     1
2019-03-25     1
2019-03-26     0
2019-03-27     1
2019-03-28     0
2019-03-29     1

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Чтобы перефразировать ваш вопрос, вы ищете вывод, который показывает, есть ли в вашей таблице дата в диапазоне (выход = 1) или нет записи (выход = 0).

Предположение : у вас будет начальная и конечная дата для вашего запроса, например, ... BETWEEN '2019-03-24' AND '2019-03-29'

Самый простой способ сделать это - «Таблица подсчета», также называемая «Таблица чисел». Это табличный объект, содержащий последовательность чисел, начиная с 0 или 1 и заканчивая тем числом, которое вам нужно. В этом примере я создам динамическую таблицу подсчета, но вы можете обнаружить, что хотите сохранить постоянную таблицу подсчета где-нибудь в вашей базе данных, чтобы вам не приходилось каждый раз создавать ее на лету.

DECLARE @startDate date = '2019-03-24'
DECLARE @endDate date = 2019-03-29

-- Get the number of days between start and end date
DECLARE @days int
SET @days = datediff (day, @StartDate, @EndDate) + 1  -- Add 1 so you have six days total

-- Build the tally table
-- NOTE: Must use SELECT...INTO to user the IDENTITY function.
-- DECLARE @Tally TABLE (N int not null primary key)

- ВСТАВИТЬ В @Tally (N) ВЫБЕРИТЕ ТОП (@days) IDENTITY (INT, 0,1) AS N INTO #Tally FROM master.sys.sysколонки sc1 CROSS JOIN master.sys.sysколонки sc2 - ПРИМЕЧАНИЕ. Существуют и другие способы создания таблицы учета. Это только один пример - ПРИМЕЧАНИЕ. В SQL 2016 в таблице master.dbo.syscolumns содержится более 15 000 строк. - Взаимное соединение может быть ненужным для ваших нужд. Если это так, вы можете переписать это как: - ВСТАВЬТЕ В @Tally (N) - ВЫБЕРИТЕ ТОП (@days) - ИДЕНТИЧНОСТЬ (INT, 0,1) AS N - FROM master.sys.sys колонки sc

-- Since your dynamic tally table has only the number of entries you need, no special
--  filtering on the table is needed. However, if you have too many rows, an index
--  on the N field will help.  Simply use CREATE INDEX Idx1 ON #Tally(N)

;WITH Dates as (
   SELECT Dateadd(day, t.N, @StartDate) As CheckDate
   FROM #Tally
   )
SELECT CheckDate,
    CASE
        WHEN EXISTS (SELECT * FROM Alarm WHERE Convert(date, Alarm_Start) = CheckDate)
            Then 1
        Else 0
    END As Alarm_Exists
FROM Dates
ORDER BY CheckDate
0 голосов
/ 16 апреля 2019

Пожалуйста, попробуйте следовать

DECLARE @StartDateTime DATETIME
DECLARE @EndDateTime DATETIME

SET @StartDateTime = '1/1/2019'
SET @EndDateTime = '12/31/2019';

--delete from #tmp

;WITH DateRange(DateData) AS 
(
    SELECT @StartDateTime as Date
    UNION ALL
    SELECT DATEADD(d,1,DateData)
    FROM DateRange 
    WHERE DateData < @EndDateTime
)
SELECT DateRange.DateData, CASE WHEN Your_table.DateCol IS NULL THEN 0 ELSE 1 END AS NUM
FROM DateRange LEFT OUTER JOIN 
(VALUES ('1/1/2019'),('1/3/2019')) AS Your_table(DateCol)
ON DateRange.DateData  = CAST(Your_table.DateCol AS date)
OPTION (MAXRECURSION 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...