【问题标题】:SQL Combine Date and Time columns into single DateTime columnSQL 将日期和时间列合并为单个 DateTime 列
【发布时间】:2021-03-02 12:29:41
【问题描述】:

我想将两个 datetime2 列(分别称为 Date 和 Time)合并到同一个表中的一个 datetime2 列中。之后将删除 2 个旧列。

此查询在测试组合时有效。

SELECT CAST(DATEADD(day, 0, DATEDIFF(day, 0, Date)) AS DATETIME)
    + CAST(DATEADD(day, 0 - DATEDIFF(day, 0, Time), Time) AS DATETIME)
    FROM dbo.Orders

目前我已经尝试了以下方法,但我不知道如何将结果放入名为 OrderDate 的现有列中。

已解决

UPDATE dbo.Orders 
SET
OrderDate = CAST(DATEADD(day, 0, DATEDIFF(day, 0, Date)) AS DATETIME)
+ CAST(DATEADD(day, 0 - DATEDIFF(day, 0, Time), Time) AS DATETIME);

【问题讨论】:

  • 这告诉你到底是什么问题,我怀疑你的表dbo.Orders只有1行。
  • 您不能在datertime2 字段中存储时间。如果要存储时间,请使用time。如果您只想存储日期,请使用date
  • 为什么要对同一个表使用子查询?为什么您想要每一行的值设置为包含数据库中每一行的值?当然,您根本不需要在这里进行子查询。

标签: sql sql-server tsql


【解决方案1】:

为什么是子查询?直接使用表达式即可。 (仅作记录:也许表达式也可以优化/简化,我没有研究这个。)

UPDATE dbo.orders 
       SET orderdate = cast(dateadd(DAY, 0, datediff(DAY, 0, date)) AS datetime)
                       + cast(dateadd(DAY, 0 - datediff(DAY, 0, time), time) AS datetime);

【讨论】:

  • 谢谢,这解决了我的问题。我对 SQL 很陌生,所以怀疑这是我的愚蠢行为。
  • 您好Formant,如果您因为他的回答而得到解决方案,请您将其标记为答案。
猜你喜欢
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 2015-12-23
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多