【问题标题】:SQL Get Data from everyday from a date rangeSQL 从日期范围内每天获取数据
【发布时间】:2019-09-18 22:54:51
【问题描述】:

我必须构建一个图表,根据多个过滤器(周、月、自定义日期范围)显示每天的数据。

问题是在我的数据库中我只有创建记录的日期,这意味着

where Date >= @start AND Date <= @start

在没有记录的日子里不会返回行。

我希望它在那些日子里返回结果为 0 的行,但我不知道如何在 SQL 中执行此操作

数据示例

2019-09-13 12:00:43.7761868
2019-09-13 12:01:20.8275512
2019-09-13 21:28:59.3311800
2019-09-13 21:32:12.8601389
2019-09-14 04:37:25.6108193
2019-09-16 13:34:39.7449688
2019-09-16 14:06:18.0098897
2019-09-16 14:59:22.4131463
2019-09-16 15:00:38.8086073
2019-09-17 05:45:06.9280049
2019-09-17 05:45:50.1708972
2019-09-17 13:50:23.9503997
2019-09-17 13:55:13.1940063
2019-09-17 18:40:26.3523765
2019-09-17 18:41:08.2932910
2019-09-18 03:48:59.2092904
2019-09-18 03:49:41.0802705
2019-09-18 06:10:47.0732559
2019-09-18 06:11:30.1833908

注意没有关于日期的记录

2019-09-15

预期的结果是

2019-09-13 
2019-09-14 
2019-09-15
2019-09-16 
2019-09-17 
2019-09-18 

【问题讨论】:

  • 您似乎想要NOT IN(),但“返回结果为0 的行” 不清楚。当您说表示结果为 1 的行时,另一方面您说结果为 0。请编辑您的问题以包含示例数据和所需结果作为格式化文本而不是图像。
  • 您需要一个日历表 - 静态表(首选)或动态构建的表。您从日历外部连接到您的数据并在所需的基础上进行聚合(每天、每月等)。使用外连接,您的结果至少包含每个日期的一行。这类事情有很多讨论。
  • 用数据示例更新帖子
  • @SM我明白了,我会尝试这种方法
  • 同意@SMor。这是您可能会发现有用的链接:mssqltips.com/sqlservertip/4054/…

标签: sql sql-server


【解决方案1】:
--Pseudo code for creating a Calendar table using a Common Table Expression (CTE) 
--and Custom date range

DECLARE @StartDate datetime,@EndDate datetime

SET @StartDate = '2019-09-13'
SET @EndDate = '2019-09-18'

;WITH CalendarDates(DATEPARAM) AS
(
    SELECT @StartDate AS datetime
    UNION ALL
    SELECT DATEADD(DAY, 1, DATEPARAM)
    FROM CalendarDates
    WHERE DATEPARAM < @EndDate 
) 
SELECT CD.DATEPARAM ,count(convert(date,T.testdate)) as records_on_theday
FROM @T T
Right outer join CalendarDates CD on CD.DATEPARAM = convert(date,T.testdate)
Group By convert(date,T.testdate),CD.DATEPARAM

Sample Code Here..

在上面的代码示例中,我们假设搜索基于给定的开始和结束日期(自定义日期范围过滤器)。所以CalendarDates CTE 将给出此范围之间的所有日期。带有源表的Right Outer Join 将给出您想要作为最终输出的记录数。希望这会有所帮助!

【讨论】:

    【解决方案2】:

    全年

     SELECT * FROM  YourTableName WHERE DATEPART(YEAR, Date_ColumnName) = @Year 
    

    月份

    SELECT * FROM  YourTableName WHERE DATEPART(MONTH, Date_ColumnName) = @Month 
    

    一天

      SELECT * FROM  YourTableName WHERE DATEPART(DAY, Date_ColumnName) = @Day 
    

    自定义日期范围

    SELECT * FROM YourTableName
    WHERE 
    convert(DATETIME,Date_ColumnName)  
    BETWEEN Convert(DATETIME,CASE WHEN isnull(@FromDate,'')='' THEN Date_ColumnName
    ELSE isnull(@FromDate,'') END)                     
    AND Convert(DATETIME, CASE WHEN isnull(@ToDate,'')='' THEN Date_ColumnName 
    ELSE isnull(@ToDate,'') END)  
    

    注意:-您可以尝试所有查询...null部分也是自定义日期范围中的句柄.....我已经测试过了...

    【讨论】:

    • 我试过这个,但它不起作用。我用一个数据示例编辑了我的帖子。希望对你有帮助
    猜你喜欢
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多