【问题标题】:Match time, Concatenate to datetime, and store as datetime column in SQL Server 2012在 SQL Server 2012 中匹配时间、连接到日期时间并存储为日期时间列
【发布时间】:2015-07-26 13:31:19
【问题描述】:

我今天遇到了一个奇怪的问题。请帮助找出FirstTimeReported 列。 http://sqlfiddle.com/#!3/2e9845/1

表格列:

SupportID int primary key, 
DateEntered datetime, 
ReportedTime varchar(4)

输入数据

SupportID   DateEntered               ReportedTime
1001        2015-04-13 09:15:00       0900
2001        2015-04-14 00:10:00       2355

预期结果:

SupportID     FirstTimeReported
1001          2015-04-13 09:00:00
2001          2015-04-13 23:55:00

更新:这是我刚刚从@Dan Guzman 的代码修改的工作解决方案 2:

SELECT
      SupportID
    , CASE 
        WHEN DATEADD(minute, CAST(RIGHT(ReportedTime, 2) AS int), DATEADD(hour, CAST(LEFT(ReportedTime, 2) AS int), CAST(CAST(DateEntered AS date) AS datetime))) <= DateEntered THEN DATEADD(minute, CAST(RIGHT(ReportedTime, 2) AS int), DATEADD(hour, CAST(LEFT(ReportedTime, 2) AS int), CAST(CAST(DateEntered AS date) AS datetime)))
        ELSE DATEADD(day, -1, DATEADD(minute, CAST(RIGHT(ReportedTime, 2) AS int), DATEADD(hour, CAST(LEFT(ReportedTime, 2) AS int), CAST(CAST(DateEntered AS date) AS datetime)))) 
      END AS FirstTimeReported
FROM SupportContacts;

【问题讨论】:

  • 我不允许使用更新和插入功能,所以我只需要用一个选择语句来弄清楚。我可以得到 SupportID 1001 的 FirstTimeReported,因为我可以从 DateEntered 中删除时间并从 ReportedTime 中连接时间。对于 SupportID 2001,问题是由于午夜而出现的。

标签: sql-server sql-server-2012-express


【解决方案1】:

我假设计算的 FirstTimeReported 应该是过去的,源自 DateEntered。这当然假设该行是在 ReportTime 的 24 小时内输入的。

WITH
    SupportContactsFirstTimeReported AS (
        SELECT 
              SupportID
            , DateEntered
            , DATEADD(minute, CAST(RIGHT(ReportedTime, 2) AS int), DATEADD(hour, CAST(LEFT(ReportedTime, 2) AS int), CAST(CAST(DateEntered AS date) AS datetime))) AS CalculatedReportedTime
        FROM supportContacts
    )
SELECT
      SupportID
    , CASE 
        WHEN CalculatedReportedTime <= DateEntered THEN CalculatedReportedTime
        ELSE DATEADD(day, -1, CalculatedReportedTime) 
      END AS FirstTimeReported
FROM SupportContactsFirstTimeReported;

【讨论】:

  • 根据我迄今为止从最终用户那里了解到的情况,您的假设是正确的。让我试试你的代码,很快就会更新你。非常感谢。
  • 如果 DateEntered 可能比 ReportedTime 晚 24 小时以上,则此数据无法解决。最好的方法是使 ReportedTime 成为一个日期时间列,其中包含事件的完整日期和时间。这将提高性能和数据完整性。
  • 丹·古兹曼!我还有其他需要在代码中的“WITH”语句之前包含的内部连接。如何在此处包含“WITH”之上的加入?非常感谢您的代码。
  • @sky_limit,您可以将连接添加到最后的 SELECT 语句或 CTE 表达式内的 SELECT
  • 太棒了。你是最棒的。非常感谢你。再见。
猜你喜欢
  • 2013-04-21
  • 2021-12-21
  • 2017-04-22
  • 1970-01-01
  • 2011-09-06
  • 2016-09-19
  • 2018-09-20
  • 1970-01-01
  • 2021-10-22
相关资源
最近更新 更多