Using Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64). 

Given a table and index:

    create table [User].[Session] 
    (
      SessionId int identity(1, 1) not null primary key
      CreatedUtc datetime2(7) not null default sysutcdatetime())
    )
    
    create nonclustered index [IX_User_Session_CreatedUtc]
    on [User].[Session]([CreatedUtc]) include (SessionId)

Actual Rows for each of the following queries is 3.1M, the estimated rows are shown as comments.

When these queries feed another query **in a View**, the optimizer chooses a loop join because of the 1 row estimates.  **How to improve the estimate at this ground level to avoid overriding the parent query join hint or resorting to an SP?**

Using a hardcoded date works great:

     select distinct SessionId from [User].Session -- 2.9M (great)
      where CreatedUtc > '04/08/2015'  -- but hardcoded

These equivalent queries are view compatible but all estimate 1 row:

    select distinct SessionId from [User].Session -- 1
     where CreatedUtc > dateadd(day, -365, sysutcdatetime())		 
    
    select distinct SessionId from [User].Session  -- 1
     where dateadd(day, 365, CreatedUtc) > sysutcdatetime();    	  
    
    select distinct SessionId from [User].Session s  -- 1
     inner loop join  (select dateadd(day, -365, sysutcdatetime()) as MinCreatedUtc) d
        on d.MinCreatedUtc < s.CreatedUtc    
        -- (also tried reversing join order, not shown, no change)

    select distinct SessionId from [User].Session s -- 1
     cross apply (select dateadd(day, -365, sysutcdatetime()) as MinCreatedUtc) d
     where d.MinCreatedUtc < s.CreatedUtc
        -- (also tried reversing join order, not shown, no change)

Try some hints (but N/A to View):

     select distinct SessionId from [User].Session -- 1
      where CreatedUtc > dateadd(day, -365, sysutcdatetime())
     option (recompile);
    
    select distinct SessionId from [User].Session  -- 1
     where CreatedUtc > (select dateadd(day, -365, sysutcdatetime()))
     option (recompile, optimize for unknown);
            
    select distinct SessionId                     -- 1
      from (select dateadd(day, -365, sysutcdatetime()) as MinCreatedUtc) d
     inner loop join [User].Session s    
        on s.CreatedUtc > d.MinCreatedUtc  
    option (recompile);

Try using Parameter/Hints (but N/A to View):

    declare
    	@minDate datetime2(7) = dateadd(day, -365, sysutcdatetime());
    	
    select distinct SessionId from [User].Session  -- 1.2M (adequate)
     where CreatedUtc > @minDate;
    
    select distinct SessionId from [User].Session  -- 2.96M (great)
     where CreatedUtc > @minDate
    option (recompile);
    
    select distinct SessionId from [User].Session  -- 1.2M (adequate)
     where CreatedUtc > @minDate
    option (optimize for unknown);


[![Estimate vs Actual][1]][1]


The statistics are up to date. 

    DBCC SHOW_STATISTICS('user.Session', 'IX_User_Session_CreatedUtc') with histogram;

The last few rows of the histogram (189 rows total) are shown:

[![enter image description here][2]][2]



  [1]: https://i.sstatic.net/pjTNV.jpg
  [2]: https://i.sstatic.net/9kVD5.jpg