Search code examples
sql-serversql-server-2012-express

Match time, Concatenate to datetime, and store as datetime column in SQL Server 2012


I ran into a weird issue today. Please help figuring out the FirstTimeReported column. http://sqlfiddle.com/#!3/2e9845/1

Table columns:

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

Input data

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

Expected results:

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

Update: Here is the Working solution 2 that I just modified from @Dan Guzman's code:

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;

Solution

  • I assume the calculated FirstTimeReported should be in the past, derived from the DateEntered. This assumes of course that the row is entered within 24 hours of the ReportTime.

    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;