【问题标题】:Swap date fields when one date is less than the other当一个日期小于另一个日期时交换日期字段
【发布时间】:2014-05-07 19:42:05
【问题描述】:

我试图翻转日期字段,因为出于某种原因,将数据发送给我们的人将它们放在了错误的字段中。基本上只要 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

有什么想法吗?

【问题讨论】:

  • 为什么要将它们转换为 varchar 以便进行比较?日期有一个固有的顺序。
  • 你也有一些id 作为表格列吗?
  • @StuartAinsworth 我根据我阅读的内容转换为 varchar,因为另一种方式也不起作用。

标签: tsql sql-update


【解决方案1】:

假设您有唯一 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

【讨论】:

  • 非常感谢。我假设我可以根据我阅读的内容不使用单独的表格来做到这一点。我猜他们和我错了。
【解决方案2】:

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

您正在与 varchars 进行比较,后者将按字母顺序进行比较。如果您想将值作为日期进行比较,则无需将它们转换为其他任何值

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

【讨论】:

  • 糟糕已修复。我复制了错误的查询仍然不能那样工作。
猜你喜欢
  • 2013-06-24
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
相关资源
最近更新 更多