我正在尝试翻转日期字段,因为某些原因将数据发送给我们的人将他们放在了错误的字段中。基本上每当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
有什么想法吗?
答案 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