Compute date column if other date columns not null ?

  • Hi, I am a part time amateur programmer, and really need some help. I have 5 date columns: DateComplete, Date1, Date2, Date3, Date4.  In SSMS, is there a way to make a computed column defined like this: If Date1 and Date2 and Date3 and Date4 are Not Null, then DateComplete = Date.Today

    Then the DateComplete column must not be recomputed every time. Once the date is inserted, it must remain intact.
    Is that even possible?
    Thanks in advance. I am looking for a way to define that column in ssms column definition. I know WHERE to put it, but not WHAT to put in there. Thanks again.

  • CREATE TABLE #t
        (
          Id int IDENTITY NOT NULL
        , date1 date
        , date2 date
        , date3 date
        , date4 date
        , date5 AS
          CASE
             WHEN   date1 IS NOT NULL
                AND date2 IS NOT NULL
                AND date3 IS NOT NULL
                AND date4 IS NOT NULL
                THEN Cast(GetDate() AS date) ELSE Cast(NULL AS date) END );
    INSERT #t (
          date1
        , date2
        , date3
        , date4
          )
    VALUES
    (
       GetDate()
     , GetDate()
     , GetDate()
     , GetDate()
    ),
    (
       GetDate()
     , NULL  
     , GetDate()
     , GetDate()
    );
    SELECT * FROM #t t;
    DROP TABLE #t;

  • Thank you for the reply, I really appreciate your time.
    I apologize if I wasn't clear enough. Is there a way to put that formula in here so that it runs automatically? or am I on the wrong track altogether

    data:image/png;base64,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

  • Joe Torre - Thursday, April 12, 2018 3:42 PM

    CREATE TABLE #t
        (
          Id int IDENTITY NOT NULL
        , date1 date
        , date2 date
        , date3 date
        , date4 date
        , date5 AS
          CASE
             WHEN   date1 IS NOT NULL
                AND date2 IS NOT NULL
                AND date3 IS NOT NULL
                AND date4 IS NOT NULL
                THEN Cast(GetDate() AS date) ELSE Cast(NULL AS date) END );
    INSERT #t (
          date1
        , date2
        , date3
        , date4
          )
    VALUES
    (
       GetDate()
     , GetDate()
     , GetDate()
     , GetDate()
    ),
    (
       GetDate()
     , NULL  
     , GetDate()
     , GetDate()
    );
    SELECT * FROM #t t;
    DROP TABLE #t;

    The problem with that is that the date in the calculated column will change over time, which is very visible if you change the calculation to this and do some back to back selects.

    date5 AS
      CASE
       WHEN date1 IS NOT NULL
        AND date2 IS NOT NULL
        AND date3 IS NOT NULL
        AND date4 IS NOT NULL
        THEN GetDate()  ELSE NULL END; 

    You could do it with a trigger something like,

    CREATE TABLE TESTY_DATES
      (
      Id int IDENTITY NOT NULL
      , date1 date
      , date2 date
      , date3 date
      , date4 date
      , date5 datetime
        )

    GO
    CREATE TRIGGER TESTY_DATE_TRIGGER ON TESTY_DATES
    AFTER INSERT, UPDATE
    AS BEGIN

    UPDATE TESTY_DATES SET date5 = getdate() WHERE TESTY_DATES.Id IN(SELECT Id FROM inserted WHERE date1 IS NOT NULL AND date2 IS NOT NULL AND date3 IS NOT NULL AND date4 IS NOT NULL AND date5 IS NULL)

    END

    INSERT INTO TESTY_DATES ( date1, date2, date3, date4)
    VALUES
    (
     GetDate()
    , GetDate()
    , GetDate()
    , GetDate()
    ),
    (
     GetDate()
    , NULL 
    , GetDate()
    , GetDate()
    );
    SELECT * FROM TESTY_DATES t;

    UPDATE TESTY_DATES SET date2 = getdate() WHERE Id = 2
    UPDATE TESTY_DATES SET date2 = NULL WHERE Id = 1

    SELECT * FROM TESTY_DATES t;

    DROP TABLE TESTY_DATES;

  • @Ld,
    If you create the computed column in SQL or in the GUI the result is the same. To persist the computed column in SQL:
    CREATE TABLE #t
    (
    Id int IDENTITY NOT NULL
    , date1 date
    , date2 date
    , date3 date
    , date4 date
    , date5 AS
    CASE
    WHEN date1 IS NOT NULL
    AND date2 IS NOT NULL
    AND date3 IS NOT NULL
    AND date4 IS NOT NULL
    THEN Cast(GetDate() AS date) ELSE Cast(NULL AS date) END PERSISTED );

    The only reason to persist a computed column would be to index it. If you plan to do that, any procedures using it will need the same SET options as an indexed view. 
    SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON
    SET NUMERIC_ROUNDABORT OFF

  • Joe Torre - Thursday, April 12, 2018 6:13 PM

    @Ld,
    If you create the computed column in SQL or in the GUI the result is the same. To persist the computed column in SQL:
    CREATE TABLE #t
    (
    Id int IDENTITY NOT NULL
    , date1 date
    , date2 date
    , date3 date
    , date4 date
    , date5 AS
    CASE
    WHEN date1 IS NOT NULL
    AND date2 IS NOT NULL
    AND date3 IS NOT NULL
    AND date4 IS NOT NULL
    THEN Cast(GetDate() AS date) ELSE Cast(NULL AS date) END PERSISTED );

    The only reason to persist a computed column would be to index it. If you plan to do that, any procedures using it will need the same SET options as an indexed view. 
    SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON
    SET NUMERIC_ROUNDABORT OFF

    That table won't even create, you'll get a nice error, Computed column 'date5' in table '#t' cannot be persisted because the column is non-deterministic.

    And as I noted earlier if you create it without persisted the original value will not be preserved.

  • Ld - Thursday, April 12, 2018 3:29 PM

    Hi, I am a part time amateur programmer, and really need some help. I have 5 date columns: DateComplete, Date1, Date2, Date3, Date4.  In SSMS, is there a way to make a computed column defined like this: If Date1 and Date2 and Date3 and Date4 are Not Null, then DateComplete = Date.Today

    Then the DateComplete column must not be recomputed every time. Once the date is inserted, it must remain intact.
    Is that even possible?
    Thanks in advance. I am looking for a way to define that column in ssms column definition. I know WHERE to put it, but not WHAT to put in there. Thanks again.

    As some other posters responding have indicated, there are two ways to handle this scenario, but only the trigger will comply with "must not be recomputed every time".   It was coded to check for a NULL value in date5, whereas the computed column simply can't do that.  However, I would be somewhat concerned about a data scenario with that kind of compliance.  If a date column is being set back to NULL after having a value, do you really want to say that your datecomplete column is still the original completion date?   I'm just thinking about the consistency of your data.   This scenarios suggests that maybe any old value for the datecompleted column should be tracked into a history table.  What say you, @Ld ?

    Steve (aka sgmunson) 🙂 🙂 🙂
    Rent Servers for Income (picks and shovels strategy)

  • HI Steve / Everyone that posted

    First, I really appreciate everyone's time spent on my question. I thank you for the input, and suggestions. This is my first post on here, even though I read it a lot. I have gained enormous knowledge and practical application tips from this forum.

    After spending a lot of time thinking about this overnight, I came to basically the same conclusion as Steve, in that I would be concerned about the integrity of the DateComplete column, in the event one of the other dates changes. For this instance, I think that creating a class in my code and handling that way will be the best solution, rather than in the db itself.

    Again, thank you all for your time, I will do this in code behind and be done.
    I hope everyone has a great weekend ! Thanks again!
    at least I came to a conclusion ... 🙂 , which was the whole point !

  • Ld - Friday, April 13, 2018 11:55 AM

    HI Steve / Everyone that posted

    First, I really appreciate everyone's time spent on my question. I thank you for the input, and suggestions. This is my first post on here, even though I read it a lot. I have gained enormous knowledge and practical application tips from this forum.

    After spending a lot of time thinking about this overnight, I came to basically the same conclusion as Steve, in that I would be concerned about the integrity of the DateComplete column, in the event one of the other dates changes. For this instance, I think that creating a class in my code and handling that way will be the best solution, rather than in the db itself.

    Again, thank you all for your time, I will do this in code behind and be done.
    I hope everyone has a great weekend ! Thanks again!
    at least I came to a conclusion ... 🙂 , which was the whole point !

    Glad you came to a conclusion.   Given the options, I would have chosen the trigger because it encapsulates the logic in the database, and makes it easy to ensure that the data remains consistent with the other columns.  If I had to keep track of the changes, I could create a history table and let the trigger update that as well.   I wouldn't choose to handle it in the application because that's probably a lot more effort in testing, and it doesn't handle someone going into the database and manually updating one of those columns, leaving a bit of a hole where protecting the consistency of your data is concerned.

    Steve (aka sgmunson) 🙂 🙂 🙂
    Rent Servers for Income (picks and shovels strategy)

  • I would split the dates out into a different related table with a date type column to identify what the is, like completed and a bit column indicating if it's the last date of that type. That way you keep all the history.

Viewing 10 posts - 1 through 9 (of 9 total)

You must be logged in to reply to this topic. Login to reply