Code:

raw 200:*:haltdef
raw 262:*:haltdef
raw 205:*: { set %vname $4 | haltdef }

/*
on ^*:JOIN:#: {
  !trace $nick
  msg $nick Hello %vname and welcome! Today is $date (dd/mm/yyyy) and the time is $time (CST).
}
*/
; this is my original script, but the trace was lagging? and it is showing the previous traced user.

on *:JOIN:#: {
  if (($nick == $me) || ($eval($+(%,didtrace.,$nick),2))) return
  set -eu60 $+(%,didtrace.,$nick) $true
  !trace $nick
  msg $nick Hello %vname and welcome! Today is $date (dd/mm/yyyy) and the time is $time (CST).
} 


It's showing the previous traced user because it hasn't yet had time to set %vname to the new name yet before you msg $nick. You could put the message in the raw event...

Code:

raw 200:*:haltdef
raw 262:*:haltdef
raw 205:*: {
  if ($eval($+(%,didtrace.,$4),2)) msg $4 Hello $4 and welcome! Today is $date (dd/mm/yyyy) and the time is $time (CST).
  haltdef
}

on *:JOIN:#: {
  if (($nick == $me) || ($eval($+(%,didtrace.,$nick),2))) return
  set -eu60 $+(%,didtrace.,$nick) $true
  !trace $nick
}


Change the first and second $4 in the raw 205 to be what ever token is the users nick.