生成缺失日期并添加零值,然后在sql中添加一个现有日期

时间:2019-04-16 16:17:20

标签: sql-server

我是sql的新手,我需要生成缺少的日期并添加值0,并将现有的日期值添加为1。

引用了许多有关在sql中全部显示生成缺少日期的示例,将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 :(得分:0)

请尝试关注

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)

答案 1 :(得分:0)

为重新说明您的问题,您正在寻找输出,该输出显示范围内的日期是否在表中有记录(输出= 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)     选择顶部(@天)         IDN(INT,0,1)AS N     进入#Tally     从master.sys.syscolumns sc1     交叉联接master.sys.syscolumns sc2     -注意:还有其他方法可以创建统计表。这只是一个例子     -注意:在SQL 2016中,master.dbo.syscolumns表中有15,000多行。     -根据您的需要,可能不需要交叉连接。如果是这样,您可以将其重写为:     -插入@Tally(N)     -选择顶部(@days)     -IDENTITY(INT,0,1)AS N     -来自master.sys.syscolumns 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