How to produce the effect of a date range inner join without actually doing one

I have a T-SQL inner date range join that has done the job, but now that I am starting to learn about query optimization (as in just starting), I'm scratching my head on how to make it better. I see the non-equi join as being the issue because the optimizer
scans through the entire table.  As you will see from the DDL code pasted below, there are no possible equi-joins. The enrollment history table has about 6000 rows so far, whereas the calendar table has only 10 so far, but is subject to change, which
is why I have it as a table join.
Another way to describe this is in the necessary outcome, which you see in the "Is_FAY" column in the Select statement. For each row in the Enrollment History table, I use the Case statement to determine whether the pair of Entry and Exit dates
are within the Calendar date ranges (and if so, which row the match is found). There are no nulls in either table by design.
At first, I thought of adding a non-clustered index, but the credible resources and blogs are mixed. Some sources say to use them, others say not to use them, and the remainder are on the fence. That and the
fact that I drop and recreate the table every 24 hours (there are many updates to the Black Box) makes me very leery about having indices other than the primary key.
I have pasted DDL language below with sample data.  Change the "Use Learning_Curve" statement to whatever database you want to use -- the rest will run as written.
Now that I've given you some background and what I hope to accomplish, I hope that someone has encountered this issue before and can suggest an avenue of further inquiry, because I am out of usable research sources and ideas. 
Thank you
USE Learning_Curve;
GO
IF OBJECT_ID('dbo.Enrollment_History', 'U') IS NOT NULL
DROP TABLE dbo.Enrollment_History;
CREATE TABLE dbo.Enrollment_History
(ID INT NOT NULL identity(1, 1) PRIMARY KEY,
Campus_ID INT NOT NULL,
Student_ID INT NOT NULL,
Entry_Date DATE NOT NULL,
Exit_Date DATE NOT NULL);
INSERT INTO dbo.Enrollment_History
VALUES (1, 103934, '2014-08-11', '2015-01-10'),
(1, 102912, '2014-09-10', '2015-05-10'),
(1, 199234, '2014-08-07', '2015-05-01');
IF OBJECT_ID('dbo.Calendar_FAY_Dates', 'U') IS NOT NULL
DROP TABLE dbo.Calendar_FAY_Dates;
CREATE TABLE dbo.Calendar_FAY_Dates
(ID INT NOT NULL identity(1, 1) PRIMARY KEY,
FY VARCHAR(4) NOT NULL,
Start_B DATE NOT NULL,
Start_E DATE NOT NULL,
End_B DATE NOT NULL,
End_E DATE NOT NULL);
INSERT INTO dbo.Calendar_FAY_Dates
VALUES ('FY14', '2013-08-05', '2013-08-29', '2014-04-30', '2014-05-15'),
('FY15', '2014-08-07', '2014-08-28', '2015-04-30', '2015-05-15');
SELECT eh.ID,
eh.Campus_ID,
eh.Student_ID,
eh.Entry_Date,
eh.Exit_Date,
cfd.FY,
case
when eh.Entry_Date >= cfd.Start_B
and eh.Entry_Date <= cfd.Start_E
and eh.Exit_Date >=cfd.End_B
and eh.Exit_Date <= cfd.End_E
then 1 else 0 end as Is_FAY
FROM dbo.Enrollment_History eh
inner join dbo.Calendar_FAY_Dates cfd
on eh.Entry_Date >= cfd.Start_B
and eh.Exit_Date <= cfd.End_E

This definitely a case where an indexes on the two tables will speed things up significantly. 
It's also one of those strange cases where you can't really rely on the numbers you see in the execution plan. To really get an idea the impact to need to actually time the query...
For example. Running your final query with out any additional indexes took ~4,000 microseconds...
Adding the following index, dropped that time down to ~3,000 microseconds...
CREATE NONCLUSTERED INDEX ix_Enrollment_History_EntryDates ON dbo.Enrollment_History (
Entry_Date,
Exit_Date)
INCLUDE (
ID,
Campus_ID,
Student_ID)
WITH (DATA_COMPRESSION = PAGE)
Adding the following index (and keeping the 1st) dropped it again, down to ~2,000 microseconds
CREATE NONCLUSTERED INDEX ix_CalendarFAYDates_Detes ON dbo.Calendar_FAY_Dates (
Start_B,
End_E)
INCLUDE (
Start_E,
End_B,
ID,
FY)
WITH (DATA_COMPRESSION = PAGE)
Keep in mind that 5 rows of data doesn't even begin to provide an accurate representation of read execution times against actual production data (the smallest changes in background processes on my computer caused the time to vary pretty drastically between
executions).
Anyway, the following is a quick & dirty way to test execution times when you're query tuning or checking the impact of different indexes on a query.
DECLARE @b DATETIME2(7) = SYSDATETIME()
SELECT eh.ID,
eh.Campus_ID,
eh.Student_ID,
eh.Entry_Date,
eh.Exit_Date,
cfd.FY,
case
when eh.Entry_Date >= cfd.Start_B
and eh.Entry_Date <= cfd.Start_E
and eh.Exit_Date >=cfd.End_B
and eh.Exit_Date <= cfd.End_E
then 1 else 0 end as Is_FAY
FROM dbo.Enrollment_History eh
inner join dbo.Calendar_FAY_Dates cfd
on eh.Entry_Date >= cfd.Start_B
and eh.Exit_Date <= cfd.End_E
SELECT DATEDIFF(mcs, @b, SYSDATETIME())
HTH,
Jason
Jason Long

Similar Messages

  • How to achieve the from and to date range in report builder 3.

    I AM TRYING TO CREATE ONE REPORT FROM REPORT BUILDER 3.
    WHERE I AM UNABLE TO DEFINE THE DATE RANGE.
    HOW TO ACHIEVE THE DATE RANGE IN REPORT BUILDER.
    NEED FROM DATE AND TO DATE FILTER IN REPORT BUILDER FOR PK DATE.

    Hi Ganesh,
    According to your description, you create a report in Report Builder 3.0, and create two parameters FromDate and EndDate, now you want to use the parameters in your MDX query, right?
    If in this case, here is a sample query for your reference.
    select
    {[Measures].[Internet Sales Amount]
    } on columns,
    {[Date].[Date].members} on rows
    from(
    select
    STRTOMEMBER("[Date].[Date].&["+@StartDate+"]"):STRTOMEMBER("[Date].[Date].&["+@EndDate+"]")
    ) on columns
    from [Adventure Works]
    Reference:STRTOMEMBER
    Regards,
    Charlie Liao
    TechNet Community Support

  • How to produce these effects?

    Hi! Can anyone tell me how to produce the effect in the demo "2D video photo monage" in FCP?
    Please click the following link:
    http://www.vki-party.com/samplewedding_video1.html
    and choose "2D video photo monage"
    I want to make the photos animate in a 3-D way like the 2nd and 6th photo in the demo.
    thanks.

    Those are fairly simple moves that you can do right in FCP, or Motion ... or After Effects. Also, there are MANY programs on the market that will automate the process for you.
    -DH
    also see: http://www.kenstone.net/cgi/discussions/general.cgi?read=84867#TOP

  • How to get the today's julian date in java?

    how to get the today's julian date in java?
    hi can any one tell me how to get the todays julian date using Calender class or GregorianCalender class....
    Julian date for 2006.November.01 AD 05:54 PM : 2454041.0
    i have tryied with
    calJ.setGregorianChange(new Date(Long.MAX_VALUE));
    System.out.println(sdf2.format(calJ.getGregorianChange()));
    thanks
    Tushar
    Message was edited by:
    lad_tushar

    thanks a lot....for intrest....
    I have found some details about the Julian calendar as follows:
    The Julian date for 2006: JAN: 01:12:01:59 is 2453737.00138
    245 represent the year digits for year 2006
    3737 represent the date fir 1 Jan
    .00138 represents the time for 12:01:59
    Julian date change as per every day 12 noon it increase one digit in it.
    As per ref from
    http://www.aavso.org/observing/aids/jdcalendar.shtml
    Also chk this calendar where Julian date is 20. October 2006 for 02 November 2006
    As per ref from
    http://www.calendar.sk/julian_calendar-en.php
    I have tried the pure �GregorianCalendar� class from jdk1.4 API and its setGregorianChange method but not getting as per the expected Julian date format. Using the �setGregorianChange()� i have setting the cutover date to Long.MAX_VALUE it means GregorianCalendar now have to act as per the Julian calendar ...so after setting the cutover date it return me changed date using �getGregorianChange()� but that was not the Julian date of the current date...as expected or as per above both scenario. Even though the last two digits are nowhere equal to the actual Julian date.
    Program
    GregorianCalendar cal = new GregorianCalendar();
    cal.setGregorianChange(new Date(Long.MAX_VALUE)); // setting the calendar to act as a pure Julian calendar.
    // cal.set(Calendar.DATE, new Date().getDate()); // seting the current date
    // Date todayJD = cal.getGregorianChange(); // getting the changed date after the setGregorianChange
    Date todayJD = cal.getTime(); // getting the calculated time of today�s Julian date
    SimpleDateFormat sdfJulianDate = new SimpleDateFormat("yyDDD");
    SimpleDateFormat sdfJuliandayOfYear = new SimpleDateFormat("DDD");
    System.out.println("today Date = " + new Date());
    System.out.println("Today as julian date = " + sdfJulianDate.format(todayJD));
    System.out.println("Today as day of year = " + sdfJuliandayOfYear.format(todayJD));
    OUTPUT:
    USING : Date todayJD = cal.getGregorianChange();
    Today Date = Thu Nov 02 15:17:05 IST 2006
    Today as julian date = 94229
    Today as day of year = 229
    USING : cal.set(Calendar.DATE, new Date().getDate());
    Today Date = Thu Nov 02 15:19:22 IST 2006
    Today as julian date = 06319
    Today as day of year = 319
    USING : Date todayJD = cal.getTime();
    Today Date = Thu Nov 02 15:17:59 IST 2006
    Today as julian date = 06306
    Today as day of year = 306
    There is one another concept i found to get the Julian day of the year as per the Julian day chart mention on nasa site (http://angler.larc.nasa.gov/armsgp/JulianDayChart.html) and i m getting the moth of the year that is 306 for nov 02 2006 using getTime() method in above code then the out put is right for Julian day. But it was not as per the expected Julian date format. So in conclusion we can only able to retrieve the day of year for the Julian calendar. hope their will be a solution for this problem in java api ....else we allways have to depend upon the third party api that was not accepteble some times.....
    Kindly chk chart on the site
    http://angler.larc.nasa.gov/armsgp/JulianDayChart.html
    http://weather.uwaterloo.ca/julian.html
    http://www.fs.fed.us/raws/book/julian.shtml
    Thanks,
    Tushar Lad

  • How to get the difference of two dates in years,months and days

    Hi friends,
    how to get the difference of two dates in years,months and days
    for ex 2 years 3 months 13 days
    select (sysdate-date_Start) from per_periods_of_service
    thanks

    Something like this...
    SQL> ed
    Wrote file afiedt.buf
      1  with t as (select to_date('17-nov-2006','dd-mon-yyyy') as c_start_date, to_date('21-jan-2008','dd-mon-yyyy') as c_end_date from dual union all
      2             select to_date('21-nov-2006','dd-mon-yyyy'), to_date('17-feb-2008','dd-mon-yyyy') from dual union all
      3             select to_date('21-jun-2006','dd-mon-yyyy'), to_date('17-jul-2008','dd-mon-yyyy') from dual
      4             )
      5  -- end of test data
      6  select c_start_date, c_end_date
      7        ,trunc(months_between(c_end_date, c_start_date) / 12) as yrs
      8        ,trunc(mod(months_between(c_end_date, c_start_date), 12)) as mnths
      9        ,trunc(c_end_date - add_months(c_start_date, trunc(months_between(c_end_date, c_start_date)))) as dys
    10* from t
    SQL> /
    C_START_D C_END_DAT        YRS      MNTHS        DYS
    17-NOV-06 21-JAN-08          1          2          4
    21-NOV-06 17-FEB-08          1          2         27
    21-JUN-06 17-JUL-08          2          0         26
    SQL>But, don't forget that different months have different numbers of days, and leap years can effect it too.

  • How to find the table in which data from a structure sits

    Hi,
    I want to know how to find the exact table where data sitting in various structures during runtime are stored.
    For instance,in ME23N we have various tabs and data in those are held in various structures. This we can see by checking the technical setting of each field.
    I want to know in which table the data is actually stored for each field and how to find them.
    Any other means other than using "WHERE USED" option?
    Thanks
    CM

    After checking for technical field from the screen, when you reach out to structure, you can dbl click on the particular field's data element. From this data-element you can get to know in which tables it is used. Also if the data element refers to some master data field then you can check out its domain and in the domain you can refer the<b> value table</b> for that domain. This is what i will do if i am not sure about anything.
    Hope it will help a little.
    Jignesh.

  • My iPhone 5 has broken and is being replaced with a new iPhone tomorrow. However, My carrier (orange) will b picking up my broken iPhone and I am unsure how to secure the content and icloud data on the broken phone. Is there a way to display the data?

    My iPhone 5 has broken and is being replaced with a new iPhone tomorrow. However, My carrier (orange) will b picking up my broken iPhone and I am unsure how to secure the content and icloud data on the broken phone. Is there a way to disable the data held on it and ensure that if it is fixed, nobody can use/see my data and access my account?

    Hi Gazpan,
    Thanks for visiting Apple Support Communities.
    I recommend using the steps in this article to back up your iPhone if possible:
    iOS: Back up and restore your iOS device with iCloud or iTunes
    http://support.apple.com/kb/ht1766
    You may also find this advice helpful for your situation:
    What to do before selling or giving away your iPhone, iPad, or iPod touch
    http://support.apple.com/kb/ht5661
    If you no longer have your iOS device
    If you're using iCloud and Find My iPhone on the device, you can erase the device remotely and remove it from your account by signing in to icloud.com/find, selecting the device, and clicking Erase. When the device has been erased, click Remove from Account.
    If you're unable to complete either of the above steps, you should change your Apple ID password. Changing your password won't remove any personal information that is cached on the device, but it will make sure that the new owner can't delete your information from iCloud.
    Cheers,
    Jeremy

  • I-photo:  I used 2 cameras to take pictures on a trip --- i have put the pictures from both cameras into an album --- when i click on view and then sort by date, the pictures do not sort by date --- any ideas on how to get the pics sorted by date?

    I-photo:  I used 2 cameras to take pictures on a trip --- i have put the pictures from both cameras into an album --- when i click on view and then sort by date, the pictures do not sort by date --- any ideas on how to get the pics sorted by date?

    Select all the photos that you need to change, then click the "Photos" menu and choose "Adjust Date and Time".
    If you add a year, it will adjust all the photos that you selected by adding a year (so if you accidentally select one of the photos that already has "2012", that will change to "2013"). 

  • How to download the ALV Hierchial Tree Data to an Excel sheet.

    Hi All,
    Can any body please let me ,if there is any possibility to know How to download the ALV Hierchial Tree Data to an Excel sheet.
    If yes, please let me know how could this can b acheived.
    Regards,
    Rohini.

    Hi Rohini
    There is no such functionality provided by SAP to download ALV Tree Hierarichal Tree into excel sheet .
    If you had this kind of senario then i can propose one solution create two radio buttons one is to display in ALV Tree Format and the other is classical report which you can download it for futher process
    Regards
    Hitesh Batra

  • How to get the name of a Data Element of a generic Table!

    Hi guys!
    In my function i have the following import paramenter
    i_outtab type standard table
    now i import a table and i want to get the dataelement of the fields.
    is there a way to do this??

    Hello Thomas
    Perhaps the following sample report may be useful for you.
    *& Report  ZUS_SDN_RTTI_STRUCT_COMPONENTS
    *& <a class="jive_macro jive_macro_thread" href="" __jive_macro_name="thread" modifiedtitle="true" __default_attr="1145711"></a>
    *& Thread: How to get the name of a Data Element of a generic Table!
    REPORT  zus_sdn_rtti_struct_components.
    TYPE-POOLS: abap.
    TYPES: BEGIN OF ty_s_outtab.
    TYPES: bukrs    TYPE bukrs.
    TYPES: kunnr    TYPE kunnr.
    TYPES: END OF ty_s_outtab.
    DATA: gdo_data    TYPE REF TO data.
    DATA: gs_outtab   TYPE ty_s_outtab.
    DATA: go_typedescr  TYPE REF TO cl_abap_typedescr,
          go_structdescr  TYPE REF TO cl_abap_structdescr,
          go_datadescr    type ref to cl_abap_datadescr.
    DATA: gs_comp        TYPE abap_compdescr,
          gd_dtel        type string,
          gt_dfies        type ddfields.
    FIELD-SYMBOLS:
      <gs_struct> TYPE ANY.
    START-OF-SELECTION.
      BREAK-POINT.
      GET REFERENCE OF gs_outtab INTO gdo_data.
      ASSIGN gdo_data->* TO <gs_struct>.
      go_typedescr = cl_abap_typedescr=>describe_by_data( <gs_struct> ).
      go_structdescr ?= go_typedescr.
      BREAK-POINT.
      LOOP AT go_structdescr->components INTO gs_comp.
        go_datadescr = GO_STRUCTDESCR->GET_COMPONENT_TYPE( gs_comp-name ).
        gd_dtel = go_datadescr->get_relative_name( ).
        write: / syst-tabix, 'Data element =', gd_dtel.
      ENDLOOP.
    END-OF-SELECTION.
    Regards
      Uwe

  • How to control the size of live data in Coherence?

    How to control the size of live data in Coherence?
    See the following statement:
    Pause times increase as the amount of live data in the heap increases. We recommend not exceeding 70% live data in your heap. This includes primary data, backup data, indexes, and application data.
    --Excerpted from http://coherence.oracle.com/display/COH35UG/Best+Practices                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           

    In any Java program, it is good practice to make sure your live objects leave some room in the heap for "scratch space." Without this, you will spend too much time in GC, and, in the worst cases, run out of memory. In the general case, you can see how much live data your application requires by looking at the heap used after a full GC's. For Coherence, you should ensure that live data, as you say, is under 70% of the maximum heap size.
    Coherence provides you tools to help enforce this policy. [http://coherence.oracle.com/display/COH35UG/local-scheme] describes how to size limit your cache. By implementing an eviction policy, you can control what happens when a size limit is exceeded.

  • How to set the timezone in a DATE datetype?

    How to set the timezone in a DATE datetype?
    Thanks
    Maximus

    10.5 Date, Time, and Timestamp
    The JDBC API follows the Java platform's approach of representing dates and times as a millisecond value relative to January 1, 1970 00:00:00 GMT. Since most databases don't support the notion of a time zone, the JDBC 2.0 API adds new methods to allow a JDBC driver to get/set Date, Time, and Timestamp values for a particular time zone using a Calendar. For example,
    ResultSet rs;
    Date date1 = rs.getDate(1);
    returns a Date object that wraps a millisecond value which denotes a particular date, like January 3, 1999, and a normalized time 00:00:00 in the default time zone. The time component of the Date is set to zero in the default time zone since SQL DATE values don't have a time component. Since a Calendar was not supplied explicitly to getDate() , the default time zone (really the default Calendar) is used by the JDBC driver internally to create the appropriate millisecond value assuming that the underlying database doesn't store time zone information.
    The following example retrieves a date value in GMT-Greenwich Mean Time.
    ResultSet rs;
    TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
    Calendar cal = Calendar.getInstance();
    Date date2 = rs.getDate(1, cal);
    In the example above, a Calendar is passed explicitly to getDate() to inform the JDBC driver how to calculate the appropriate millisecond value. Note that the same result could have been achieved by simply changing the default time zone, and not passing the Calendar explicitly since the JDBC driver will use the default time zone by default.
    Note that the two Date objects created above will not compare as equal assuming that the default time zone is not GMT, even if they represent the `same' date.
    if (date1.equals(date2))
    //never get here
    This is because each Java language Date object really just wraps a normalized millisecond time value and these millisecond values will differ across time zones. If an application wishes to compare dates in different time zones it should first convert them to a Calendar.
    An application should create a Date object using a Calendar. The application is responsible for specifying the time as 00:00:00 on the desired date when using the Calendar since JDBC uses this convention. In addition when creating a Time value the application must specify a date of January 1, 1970 to the Calendar used to create the millisecond value for the Time as this is the convention specified by JDBC for time.
    Above from:
    http://java.sun.com/products//jdk/1.2/docs/guide/jdbc/spec2/jdbc2.0.frame10.html
    I hope it can help you!

  • How to check the records in Master Data Table?

    Hi,
       I am trying to load the Master Data Table using the Flat File.Now how to check the records in Master Data Table?
    I done the following way:
    Info Provider->Info Object->Right Click->Display Data or Maintain Master Data
    But it's not showing the records.It's asking like CID from......To......
                                                                        CID(SID)from.............To.......
                                                                         here CID means customer id(characteristic).
    and showing some settings.
    Please guide me.
    Thanks & Regards

    Hi Sri,
    Go to T- code RSD1 and type your info object name and open the P- table in the infoobject then select execute symbol to see the updated  data in to master data info object.
    regards
    sap

  • How to extract the R/3 Contracts data to CIF format

    HI,
    Please help me out for how to extract the R/3 Contracts data to CIF format.
    Regards,
    Venkat

    Hi,
    Thanks for the reply.
    We do not have any APO system, our aim is to send the all R/3 contracts should be extracted as CIF and further need to be send to third part system(Quadrem).
    Any inputs plz..for our new requirement
    Regards,
    Venkat

  • How to rectify the errors in master data loads & transactional data loads?

    hy,
    please any one tell me
    How to rectify the errors in master data loads & transactional data loads?
    thnQ
    Ravi

    Hi,
    Please post specific questions in the forum.
    Please explain the error you are getting.
    -Vikram

Maybe you are looking for

  • IOS 8.1 How to batch delete unfavorable photos?

    since iOS 8, we lost the iPhoto app and the ability to batch manage photos. As sad as that is, now I'm ready to move on. With the new photo app, i see that we can mark a photo as favorite but I cannot see which photo is favorite on the grid view so I

  • I need help to make Images react to mouseclick..please read.

    So I want two things here... 1. When I press the "start" pic I want the "SpillMotor" class to start running, that is where the main game is. 2. When I press the "instruksjoner" pic I want a little box to pop up with some info I have written in a stri

  • Multiple wireless routers with Macintosh OSX - Does not work

    I work for Spokane Public Library system as an IT Specialist. At all of our branches, we use multiple WRT54G wireless devices to serve our patrons. We are having notable trouble with Macintosh clients who can get connected to the wireless network but

  • Default text properties

    Here is a part of your Helpfile: Adding text to a slide To add new text, do one of the following: To use one of the preset text effects, click Text in the Extras panel, and then drag a text sample onto the slide. To add plain text, click the Add Text

  • Flash Player plugin.exe could not be found

    Hi, since a few days Flash Player is giving me an error message saying "C:\Users\Username\AppData\Roaming\Adobe\Flash Player\Addons\plugin.exe could not be found. Please make sure you have typed the name correctly and repeat the process." on every bo