It happened to me and my clients several times. We configured special price for particular products and filled in date of start and expiration when this special price should apply. But then we often found the special prices to be visible even after the expiration date has passed.
First I thought it would be connected with a misconfigured Magento cronjob. But everything was clear in this area. At the end the problem was always solved by reindexing Product prices index. This seems to be bug in Magento itself (I run 1.8.x and 1.9.x and both are experiencing the same problem).
Fortunately the fix is pretty simple.
Create new cronjob to run everyday after midnight and reindex the indices automatically. Magento have a shell tool to make it easy withiout writing a single line of programming code.
Put this line to your crontab:
0 1 * * * /usr/bin/php /path/to/your/magento/shell/indexer.php reindexall > /dev/null