Oh dear. We have enough members that this would have been.... problematic, to say the least. @Lindy, something for your Marketplace resource testing/evaluation consideration.
/* Only get members not yet welcomed. */
$where = array( array( 'welcome_sent IS NULL' ) );
/* Only get members who joined after time delay */
$where[] = array( 'core_members.joined < ?', \IPS\DateTime::create()->sub( new \DateInterval( 'PT'.\IPS\Settings::i()->aw_welcome_delay.'H' ) )->getTimestamp() );
/* Look for matching members */
$members = \IPS\DB::i()->select( '*', 'core_members', $where, 'joined ASC', 15 )->join( 'autowelcome_members', 'core_members.member_id=autowelcome_members.welcome_member_id' );
The issue appears to be core_members.joined < (LESS THAN). The logic used is returning all members with no welcome_sent value, who joined any time before the threshold indicated. That probably should be >= instead.
Edit: For clarity, the above only gets hit if a delay is set. If no delay, you don't trigger this. Whatever you do, don't add a delay.