当一个日期小于另一个日期时,交换日期字段

时间:2014-05-07 19:42:06

标签: tsql sql-update

我正在尝试翻转日期字段,因为某些原因将数据发送给我们的人将他们放在了错误的字段中。基本上每当revived_date大于JDate时,都需要翻转它们。我尝试了下面的代码,它说它纠正了2341个字段,然后我运行了一个选择,它显示没有找到记录但是在查看数据时我清楚地看到了错误的数据。

UPDATE defendants_ALL_backup
SET JDate = revived_date, revived_date = JDate
WHERE convert(varchar,JDate, 101) < convert(varchar, revived_date, 101);

如果我选择前1000行,前3行是错误的,看起来像这样,所以它显然不起作用。

     JDate                   revived_date
2011-04-14 00:00:00.000 1986-02-11 00:00:00.000
2011-04-14 00:00:00.000 1986-02-11 00:00:00.000
2011-04-14 00:00:00.000 1986-02-11 00:00:00.000

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

在您列出的三个示例行中,JDate已经大于revived_date,因此由于您的WHERE子句,这些记录不会被交换。

您正在与varchars进行比较,这将按字母顺序进行比较。如果您想将这些值作为日期进行比较,则不需要将它们转换为其他任何内容

UPDATE defendants_ALL_backup
SET JDate = revived_date, revived_date = JDate
WHERE JDate < revived_date

答案 1 :(得分:1)

假设您有uniqnue ID且第一个日期应小于第二个日期:

DECLARE @DataSource TABLE
(
    [ID] TINYINT
   ,[DateOne] DATETIME2
   ,[DateTwo] DATETIME2
)

INSERT INTO @DataSource ([ID], [DateOne], [DateTwo])
VALUES (1, '1986-02-11 00:00:00.000', '2011-04-14 00:00:00.000')
      ,(2, '2013-02-11 00:00:00.000', '2011-04-14 00:00:00.000')
      ,(3, '2012-02-11 00:00:00.000', '2011-04-14 00:00:00.000')
      ,(4, '2011-05-11 00:00:00.000', '2011-04-14 00:00:00.000')
      ,(5, '1986-02-11 00:00:00.000', '2011-04-14 00:00:00.000')

;WITH DataForFix ([ID], [DateOne], [DateTwo]) AS
(
    SELECT [ID]
          ,[DateOne]
          ,[DateTwo]
    FROM @DataSource
    WHERE [DateOne] > [DateTwo]
)
UPDATE @DataSource 
SET [DateOne] = DFF.[DateTwo]
   ,[DateTwo] = DFF.[DateOne]
FROM @DataSource DS
INNER JOIN DataForFix DFF
    ON DS.[ID] = DFF.[ID]

SELECT [ID]
      ,[DateOne]
      ,[DateTwo]
FROM @DataSource