http://exchange.braintapper.com/listing/tag/dates/atom 2012-05-21T12:21:53.000-05:00 Braintapper Exchange - Feed for tag: dates Steven Ng http://exchange.braintapper.com/quick-conversion-of-month-abbreviations-to-numbers 2010-03-24T11:16:56.000-05:00 2010-03-24T11:16:56.000-05:00 Code Snippet: Quick Conversion of Month Abbreviations to Numbers <p>Whether you're working in Cognos, Pentaho or some other BI tool, you'll inevitably be given a data element with a date format your system doesn't like.</p> <p>Usually it involves a month abbreviation and having to convert it to a number.</p> <p>Not all formula languages provide this type of conversion with a built-in command.</p> <p>The first solution that usually comes to mind is an <code class="prettyprint">if->elseif</code> or <code class="prettyprint">case / switch</code> block to handle the month abbreviation conversion.</p> <p>There is a quicker way to do this, using the string location function in your tool of choice, which of course, is never the same between tools.</p> <p>Here's a quick version in pseudocode:<br /> <code class="prettyprint">FIND(UCASE("Jan");"###JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"))/3</code></p> <p>Let's walk through my pseudocode.</p> <p>FIND is the command that I want to use for searching my string, and here's the syntax: FIND(needle;HAYSTACK)</p> <p>It should return me with the first position of the string when found. In some formula languages, it's substr or substring.</p> <p><strong>Gotcha</strong>: Some FIND commands are indexed at 1, others at 0. That means the first character could return 0 or 1. I'm going to assume that FIND returns 0. If your FIND command returns 1, you'll have to adjust accordingly.</p> <p>So let's look at the string positions:</p> <p><code class="prettyprint">###JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC</code><br /> <code class="prettyprint">012345678901234567890123456789012345678</code></p> <p>A couple of things worthy of note. I've indexed with zero, and I've left-padded my string with hashes (#). Because of how my pseudocode FIND works, searching for "JAN" will return 3, since that's the first character position it finds. "FEB" will return 6, "MAR" will return 9 and so on.</p> <p>Since each of these results are divisible by 3, all I need to do is return the position divided by 3 to give me the month number. If your FIND command is indexed with 1, then the string positions would look like this:</p> <p><code class="prettyprint">##JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC</code><br /> <code class="prettyprint">12345678901234567890123456789012345678</code></p> <p>You should only pad your haystack string with 2 hashes in this case.</p> <p>So to recap, perform an uppercase conversion on your abbreviation in case your FIND command is case sensitive, and divide the "found" position by 3.</p> <p>Easy peasy.</p> slantyyz