编写一个sql,用于根据时间更新数据

时间:2010-05-05 09:10:06

标签: sql sql-server sql-server-2005

因为我是SQL Server和T-SQL的新手,所以我需要你的帮助。

我有2个表:实时和EOD。为了理解我的问题,我给出了2个表的示例数据:

---实时表---

Symbol     Date            Value
ABC     1/3/2009 03:05:01   327   // this day is not existed in EOD -> inserting
BBC     1/3/2009 03:05:01   458   // this day is not existed in EOD -> inserting
ABC     1/2/2009 03:05:01   326   // this day is new -> updating
BBC     1/2/2009 03:05:01   454   // this day is new -> updating
ABC     1/2/2009 02:05:01   323
BBC     1/2/2009 02:05:01   453
ABC     1/2/2009 01:05:01   313
BBC     1/2/2009 01:05:01   423

--- EOD表---

Symbol     Date            Value
ABC     1/2/2009 02:05:01   323
BBC     1/2/2009 02:05:01   453

我需要创建一个存储过程来更新符号的值。如果符号中的数据是新的(在实时和EOD之间进行比较),则会在当天更新EOD的值和日期(如果存在),否则将插入。

并且商店将使用新数据更新EOD表:

--- EOD表---

Symbol     Date            Value
ABC     1/3/2009 03:05:01   327
BBC     1/3/2009 03:05:01   458
ABC     1/2/2009 03:05:01   326
BBC     1/2/2009 03:05:01   454

P / S:我使用SQL Server 2005.我在这里有类似的回答问题:Help to the way to write a query for the requirement

请帮帮我。感谢。

2 个答案:

答案 0 :(得分:0)

以下是从Realtime表生成完整EOD表的代码(在MSSQL 2008上测试,但也应该在2005上运行)。

SELECT Symbol, Date, Value FROM
(
    SELECT *, ROW_NUMBER() OVER(
        PARTITION BY symbol, DATEPART(yy, date), DATEPART(y, date) 
        ORDER BY date desc) AS ord
    FROM Realtime
) AS t
WHERE ord = 1

根据具体要求,您可以调整它以使其以增量方式工作。

答案 1 :(得分:0)

2个步骤:

UPDATE      EOD
SET         EOD.Value = REALTIME.Value
FROM        EOD
INNER JOIN  REALTIME
ON          EOD.Symbol = REALTIME.Symbol
AND         EOD.Date = REALTIME.Date

INSERT INTO EOD ( Symbol , Date , Value )
SELECT        REALTIME.Symbol
            , REALTIME.Date
            , REALTIME.Value
FROM        EOD
LEFT JOIN   REALTIME
ON          EOD.Symbol = REALTIME.Symbol
AND         EOD.Date = REALTIME.Date
WHERE       EOD.Symbol IS NULL
AND         EOD.Date IS NULL

这假设您在两个表中的(符号,日期)都有某种唯一性。

另外一个评论是日期的包含是有问题的,特别是包含时间组件。我建议您 CAST CONVERT 将所有日期值排除在不包含时间部分的位置。我会使用CONVERT(varchar(11),EOD.Date,106)将日期转换为没有日期组件的东西。见下文:

UPDATE      EOD
SET         EOD.Value = REALTIME.Value
FROM        EOD
INNER JOIN  REALTIME
ON          EOD.Symbol = REALTIME.Symbol
AND         CONVERT(varchar(11), EOD.Date, 106) = CONVERT(varchar(11), REALTIME.Date, 106)

INSERT INTO EOD ( Symbol , Date , Value )
SELECT        REALTIME.Symbol
            , CONVERT(varchar(11), REALTIME.Date, 106)
            , REALTIME.Value
FROM        EOD
LEFT JOIN   REALTIME
ON          EOD.Symbol = REALTIME.Symbol
AND         CONVERT(varchar(11), EOD.Date, 106) = CONVERT(varchar(11), REALTIME.Date, 106)
WHERE       EOD.Symbol IS NULL
AND         EOD.Date IS NULL