【问题标题】:How to get the date difference by joining two tables?如何通过连接两个表来获取日期差异?
【发布时间】:2016-03-15 06:34:27
【问题描述】:

我有类似的数据表,

Table1:

id  Name   date
--------------
1   xxx  01/01/2015
2   yyy  01/02/2015
3   aaa  02/03/2015

Table 2:

id Name   date
--------------
 1  xxx    07/01/1015
 2  xxx    09/01/2015
 3  yyy    05/02/2015
 4. aaa    04/03/2015

我试图通过加入两个表来获取日期差异。但是我必须在第一次出现名称时使用 Table1 来获取差异。如果名称出现重复值,则仅使用 Table2 即可获得差异。请注意 (dd/mm/yyyy) 格式的日期 结果应该是这样的,

 Name  DateDifference

 xxx    6  (07/01/2015 - 01/01/2015)
 xxx    2  (07/01/2015 - 09/01/2015)
 yyy    4  (01/02/2015- 05/02/2015)
 aaa    2   (02/03/2015 -04/03/2015)

我试过的SQL查询是,

SELECT    s.spidername,   
        T1.Date, 
        MIN(T2.Date) AS Date2, 
        DATEDIFF("D", T1.Date, MIN(T2.Date)) AS DaysDiff

FROM    Spider_DailyJobCount T1
        LEFT JOIN Spider_DailyJobCount T2
            ON T1.SpiderName = T2.SpiderName
            AND T2.Date > T1.Date
join spider s on s.spidername = t1.spidername
 where //Condition
GROUP BY   T1.Date,s.spidername

我试过的LINQ查询是,

var query = (from item1 in Table1
                join item2 in Table1 on item1.Name equals item2.SpiderName
                where item2.Date > item1.Date
                join origin in Table2 on item1.Name equals origin.Name
                where // condition
                group new { item1,item2 } by new {  item1.Name,item1.Date } into grp
                select new
                {                   

                    DayDiff = DbFunctions.DiffDays(grp.Key.Date, grp.Min(d => d.item2.Date)),
                }
                ).ToList();

我已经尝试过这些东西,但无法获得所需的输出。我只尝试过 Table2 值。我真的不知道如何从 Table1 中获取第一次出现的值。 任何帮助或建议表示赞赏。 提前致谢!

【问题讨论】:

    标签: sql-server linq date


    【解决方案1】:

    t-sql解决方案

    declare @Table1 table
    (
        id  int,
        Name    varchar(3),
        date    date
    )
    
    declare @Table2 table
    (
        id  int,
        Name    varchar(3),
        date    date
    )
    
    set dateformat dmy
    
    insert into @Table1 select 1,   'xxx',  '01/01/2015'
    insert into @Table1 select 2,   'yyy',  '01/02/2015'
    insert into @Table1 select 3,   'aaa',  '02/03/2015'
    
    insert into @Table2 select 1,  'xxx',    '07/01/2015'
    insert into @Table2 select 2,  'xxx',    '09/01/2015'
    insert into @Table2 select 3,  'yyy',    '05/02/2015'
    insert into @Table2 select 4,  'aaa',    '04/03/2015'
    
    -- Actual Query
    ; with cte as
    (
        select  *, rn = row_number() over (partition by Name order by date)
        from
        (
            select * from @Table1 union all select * from @Table2
        ) t
    )
    select  c1.Name, c1.date, c2.date, diff = datediff(day, c1.date, c2.date)
    from    cte c1
        inner join cte c2   on  c1.Name = c2.Name
                    and c1.rn   = c2.rn - 1
    

    简要说明:

    • 看起来您的要求实际上是查找 2 条记录之间的日期差异
    • 这就是 UNION ALL 所做的。它将两个表合二为一
    • row_number() 是为同名的行按日期升序分配一个序号
    • 接下来是通过 INNER JOIN 获取日期差异

    【讨论】:

    • 对不起,我不熟悉 LINQ 语法
    • 如何在不插入的情况下执行此 SQl 查询。 ?
    • 您不需要插入。这是用于演示查询的示例数据。使用“实际查询”部分
    • 我收到类似“使用 UNION、INTERSECT 或 EXCEPT 运算符组合的所有查询必须在其目标列表中具有相同数量的表达式”这样的错误。
    • 您使用的是我的示例还是实际查询?请发布您的查询
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    相关资源
    最近更新 更多