【问题标题】:Not able to use a select query to get number of days in DATEADD function无法使用选择查询来获取 DATEADD 函数中的天数
【发布时间】:2016-01-12 18:20:03
【问题描述】:

我有一个表格,Table1,格式如下:

Country    No_Of_Days
  XX          5
  YY          10

我需要通过将上述表中的天数添加到 Start_date 来更新另一个表 Table2 中的 End_Date 列:

Country     Start_Date      End_Date    Calc_Manual_Flag
  XX        25-Dec-16       30-Dec-16        CALC
  YY        02-Jan-17       12-Jan-17        CALC  

我使用了以下查询,但它似乎不起作用:

UPDATE dbo.Table2
SET End_date = 
dateadd(
        day,
        (SELECT No_Of_Days FROM Table1 WHERE Table2.Country = Table1.Country),Start_Date),
    Calc_Manual_Flag = 'CALC'
WHERE Table2.End_Date IS NULL
AND Table2.Start_Date IS NOT NULL

但它似乎无法正常工作。更新似乎没有按预期进行。我收到以下错误消息:

Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery     follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

请就此提供指导。

【问题讨论】:

  • 发生了什么?
  • “工作不正常”是什么意思?你有错误吗?意外的值?
  • 我收到消息 0 行已更新
  • 对不起,我收到了一条消息……这是我收到的消息
  • Msg 512, Level 16, State 1, Line 1 子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

标签: sql sql-server-2008 dateadd


【解决方案1】:

我会使用明确的JOIN 来执行此查询:

UPDATE t2
    SET End_date = DATEADD(day, t1.No_Of_Days, t2.Start_Date)
        Calc_Manual_Flag = 'CALC'
    FROM dbo.Table2 t2 JOIN
         Table1 t1
         ON t2.Country = t1.Country
    WHERE t2.End_Date IS NULL AND t2.Start_Date IS NOT NULL;

如果你真的想更新没有匹配的行,你可以使用LEFT JOIN

这解决了问题的近端原因,即Table11 中的多个匹配行。使用任意匹配进行更新。

要真正解决问题,您需要决定要做什么。如果要减去所有匹配天数,则在加入前聚合:

UPDATE t2
    SET End_date = DATEADD(day, t1.No_Of_Days, t2.Start_Date)
        Calc_Manual_Flag = 'CALC'
    FROM dbo.Table2 t2 JOIN
         (SELECT Country, SUM(No_Of_Days) as No_Of_Days
          FROM Table1 t1
          GROUP BY Country
         ) t1
         ON t2.Country = t1.Country
    WHERE t2.End_Date IS NULL AND t2.Start_Date IS NOT NULL;

【讨论】:

  • 你好,戈登。谢谢你的回答。即使在我提出的关于子查询的新错误消息被显示后,这仍然有效吗?
  • 您好 Gordon,我测试了您的解决方案。它给了我很好的结果。但是一件奇怪的事情是它不会随机更新某些国家,即使 Start_Date 不为空并且国家在 Table1 中
  • 道歉戈登。我的 Table1 缺少一些国家/地区。因此没有更新。但除此之外,您的查询效果很好。感谢您的帮助
【解决方案2】:

错误消息清楚地表明 Country 在 First table 中有重复项,因此您需要弄清楚要如何处理重复行,或者 sumno_of_days 或根据某些顺序使用 no_of_days

UPDATE t2 
SET    End_date = Dateadd(day, t1.no_of_days, t2.start_date), 
       Calc_Manual_Flag = 'CALC' 
FROM   dbo.table2 t2 
       CROSS apply (SELECT TOP 1 no_of_days --sum(no_of_days)
                    FROM   table1 t1 
                    WHERE  t2.country = t1.country 
                    ORDER  BY somecol) cs 
WHERE  t2.end_date IS NULL 
       AND t2.start_date IS NOT NULL 

【讨论】:

  • 感谢 VR46 的帮助。我选择了 Gordon 的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 2017-06-08
相关资源
最近更新 更多