无法使用 select 查询获取 DATEADD 函数中的天数
Not able to use a select query to get number of days in DATEADD function
我有一个table,表1,格式如下:
Country No_Of_Days
XX 5
YY 10
我需要更新另一个 table 表 2 中的 End_Date 列,它有一个 Start_Date 通过将上述 table 中的天数添加到 Start_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.
请指导。
我会使用显式 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;
错误消息清楚地表明 Country
在第一个 table 中有重复项,因此您需要弄清楚要对重复行执行的操作 sum
no_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
我有一个table,表1,格式如下:
Country No_Of_Days
XX 5
YY 10
我需要更新另一个 table 表 2 中的 End_Date 列,它有一个 Start_Date 通过将上述 table 中的天数添加到 Start_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.
请指导。
我会使用显式 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;
错误消息清楚地表明 Country
在第一个 table 中有重复项,因此您需要弄清楚要对重复行执行的操作 sum
no_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