Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:根据开始和结束日期,仅对某些行求和_Sql_Sql Server_Date_Datetime - Fatal编程技术网

SQL:根据开始和结束日期,仅对某些行求和

SQL:根据开始和结束日期,仅对某些行求和,sql,sql-server,date,datetime,Sql,Sql Server,Date,Datetime,我有两个表:第一个表包含唯一标识符(UI)。每个唯一标识符都有一列包含开始日期(yyyy-mm-dd),一列包含结束日期(yyyy-mm-dd)。第二个表包含每天的温度,分别列有月份、日期、年份和温度。我想加入这些表,得到每个唯一标识符的编译温度;但是,我希望编译的温度只包括第二个表中介于第一个表的开始日期和结束日期之间的天数。 例如,如果一条记录的开始日期为15年10月12日,结束日期为15年31月12日,我希望有一列包含10-31年代的汇编温度。如果下一条记录的开始日期为12/3/15-12

我有两个表:第一个表包含唯一标识符(UI)。每个唯一标识符都有一列包含开始日期(yyyy-mm-dd),一列包含结束日期(yyyy-mm-dd)。第二个表包含每天的温度,分别列有月份、日期、年份和温度。我想加入这些表,得到每个唯一标识符的编译温度;但是,我希望编译的温度只包括第二个表中介于第一个表的开始日期和结束日期之间的天数。 例如,如果一条记录的开始日期为15年10月12日,结束日期为15年31月12日,我希望有一列包含10-31年代的汇编温度。如果下一条记录的开始日期为12/3/15-12/17/15,我希望它旁边的列显示3-17的编译温度。我将包括我到目前为止的查询,但这并没有太大帮助,因为我还没有真正做到这一点:

; with Temps as (
    select MONTH, DAY, YEAR, Temp
    from Temperatures
    where MONTH = 12
    and YEAR = 2016
    )
    Select UI, start_date, end_date, location, SUM(temp)
    from Table1 t1
    Inner join Temps
    on temps.month = month(t1.start_date)
我很感激你能给我的任何帮助。让我知道我需要详细说明任何事情

Table 1     
UI  Start_Date  End_Date
2080    12/5/2015   12/31/2015
1266    12/1/2015   12/31/2015
1787    12/17/2015  12/28/2015
1621    12/3/2015   12/20/2015
1974    12/10/2015  12/12/2015
1731    12/25/2015  12/31/2015


Table 2         
    Month   Day Year    Temp
    12  1   2016    34
    12  2   2016    32
    12  3   2016    35
    12  4   2016    37
    12  5   2016    32
    12  6   2016    30
    12  7   2016    31
    12  8   2016    36
    12  9   2016    48
    12  10  2016    42
    12  11  2016    33
    12  12  2016    41
    12  13  2016    31
    12  14  2016    29
    12  15  2016    46
    12  16  2016    48
    12  17  2016    38
    12  18  2016    29
    12  19  2016    45
    12  20  2016    37
    12  21  2016    48
    12  22  2016    46
    12  23  2016    44
    12  24  2016    45
    12  25  2016    35
    12  26  2016    44
    12  27  2016    29
    12  28  2016    38
    12  29  2016    29
    12  30  2016    35
    12  31  2016    40

Table 3 (Expected Result)           
UI  Start_Date  End_Date    Compiled Temp
2080    12/5/2015   12/31/2015  1101
1266    12/1/2015   12/31/2015  1167
1787    12/17/2015  12/28/2015  478
1621    12/3/2015   12/20/2015  668
1974    12/10/2015  12/12/2015  126
1731    12/25/2015  12/31/2015  250

你可以这样做:

; WITH temps AS (
    SELECT CONVERT(DATE, CONVERT(CHAR(4), [YEAR]) + '-' + CONVERT(CHAR(2), [MONTH]) + '-' + CONVERT(VARCHAR(2), [DAY])) [TDate], [Temp]
    FROM Temperatures
    WHERE [MONTH] = 12
    AND [YEAR] = 2015
    ) 
    SELECT [UI], [start_date], [end_date]
        , (SELECT SUM([temp]) 
        FROM temps
        WHERE [TDate] BETWEEN T1.[start_date] AND T1.[end_date]) [Compiled Temp]
    FROM Table1 T1

无需联接。

您也可以对两个表进行简单联接。你不需要使用CTE

--TEST DATA
if object_id('Table1','U') is not null
    drop table Table1

create table Table1 (UI int, Start_Date date, End_Date date)     

insert Table1
values
(2080,'12/05/2015','12/31/2015'),
(1266,'12/01/2015','12/31/2015'),
(1787,'12/17/2015','12/28/2015'),
(1621,'12/03/2015','12/20/2015'),
(1974,'12/10/2015','12/12/2015'),
(1731,'12/25/2015','12/31/2015')

if object_id('Table2','U') is not null
    drop table Table2

create table Table2 (Month int, Day int, Year int, Temp int)     

insert Table2
values
(12,1, 2015,34),
(12,2, 2015,32),
(12,3, 2015,35),
(12,4, 2015,37),
(12,5, 2015,32),
(12,6, 2015,30),
(12,7, 2015,31),
(12,8, 2015,36),
(12,9, 2015,48),
(12,10,2015,42),
(12,11,2015,33),
(12,12,2015,41),
(12,13,2015,31),
(12,14,2015,29),
(12,15,2015,46),
(12,16,2015,48),
(12,17,2015,38),
(12,18,2015,29),
(12,19,2015,45),
(12,20,2015,37),
(12,21,2015,48),
(12,22,2015,46),
(12,23,2015,44),
(12,24,2015,45),
(12,25,2015,35),
(12,26,2015,44)


--AGGREGATE TEMPS
select t1.Start_Date, t1.End_Date, avg(t2.temp) AvgTemp, sum(t2.temp) CompiledTemps
from table1 t1
    join table2 t2 ON t2.Year between datepart(year, t1.Start_Date) and datepart(year, t1.End_Date)
        and t2.Month          between datepart(month,t1.Start_Date) and datepart(month,t1.End_Date)
        and t2.Day            between datepart(day,  t1.Start_Date) and datepart(day,  t1.End_Date)
group by t1.Start_Date, t1.End_Date

您是否可以编辑您的问题以包含每个表的样本数据集以及预期/期望输出的示例?一张图片真的胜过千言万语。你确定你想要的是编译的时间而不是平均的时间吗?