Month(x) vs Between(x and y)

Ask a Question related to Microsoft SQL / MS SQL Server, Design and Development.

  1. #1

    Default Re: Month(x) vs Between(x and y)

    With few exceptions, if a column is in an expression in a
    search condition, no index on that column will be useable
    by the query processor.

    In this case, Month() could hinder performance, by making
    it impossible to use an index on ADateField to execute the
    query.

    The alternative is not quite correct, though. You at least need quotes:
    .... between '20030801' and '20030830'. If you want the query to
    be identical to the Month() one, you also need to include ADateField
    values after midnight on the 30th and any time on the 31st. You
    might have business rules to make it certain that no value of ADateField
    has a time part, or none is a weekend day, but it's safest, and just
    as efficient to write

    where ADateField >= '20030801' and ADateField < '20030901'

    The alternative also will not return any results in years before or
    after 2003, but the original will.

    Steve Kass
    Drew University

    London Developer wrote:
    >Hello,
    >
    >I wrote this query that had the line:
    >
    > Month(ADateField)=8
    >
    >and was told it is 'inefficient' and should be written:
    >
    >and DateEntered between (20030801 and 20030830)
    >
    >as it uses indexes and is more reliable e.t.c
    >
    >I countered this saying I thought the month function was easier to read and
    >can still use indexes and would also be efficient enough.
    >
    >Am I far wrong?
    >
    >
    >
    >
    Steve Kass Guest

  2. Similar Questions and Discussions

    1. Getting the day of the month
      I think it is kind of odd that the "day" property in the Date class will only return the day of the week and not the day of the month... How would...
    2. Get last day of month
      Hi, Is there a way to get the last day of each month using CFMX7 pls? E.g. I want to obtain the last day of each month, 30th June 2005...
    3. to convert a month to previous month
      How to convert a month to previous month in a very easy way? For example, I have AUGUST, but I want JULY to return. Thanks. *** Sent via...
    4. LAST DAY OF MONTH
      How can I get the last day for the current month?
    5. [PHP] LAST DAY OF MONTH
      wow. I missed that one in the manual. I guess it's time for me to call it a night. Thanks. -----Original Message----- From: Sn!per Sent:...
  3. #2

    Default Re: Month(x) vs Between(x and y)

    You're right that the Month() function is much more readable, but it is true
    that using a column inside any function means that an index on the column
    cannot be used. The index is organized by the date value itself, not by some
    function of the date value. It is much too cost prohibitive to apply the
    function to every key value while searching the index, so the index is not
    even considered.

    --
    HTH
    ----------------
    Kalen Delaney
    SQL Server MVP
    [url]www.SolidQualityLearning.com[/url]


    "London Developer" <dev@nowhere.com> wrote in message
    news:OBmBQj#PDHA.1216@TK2MSFTNGP11.phx.gbl...
    > Hello,
    >
    > I wrote this query that had the line:
    >
    > Month(ADateField)=8
    >
    > and was told it is 'inefficient' and should be written:
    >
    > and DateEntered between (20030801 and 20030830)
    >
    > as it uses indexes and is more reliable e.t.c
    >
    > I countered this saying I thought the month function was easier to read
    and
    > can still use indexes and would also be efficient enough.
    >
    > Am I far wrong?
    >
    >

    Kalen Delaney Guest

Posting Permissions

  • You may not post new threads
  • You may post replies
  • You may not post attachments
  • You may not edit your posts

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139