Bound parameters are not really "safer", but if you consistently use them with prepared statements, then they take care of the escaping for you so there is no need to call a separate function. Also, if you do it with PDO, then your application code does not have to worry about which DBMS you are using and how to escape inputs: PDO takes care of those details.
I would see filter_var() using FILTER_VALIDATE_INT (or whatever you're validating) more as part of the form validation, not for filtering values to prevent SQL injection. If, however, you are doing something where you just want to be quick-and-dirty about it and convert whatever was input into an integer without any sort of validation, casting it via b[/b] is probably the fastest way (there is no call to a separate function, nor any kind of if/else logic, etc.)
As far as bound parameters, PDO lets you bind them as you did via the execute() method's optional argument, or via the bind_param() method. The bind_param() would only be preferred if you want to use any of its additional parameters, such as the "data_type" specification, otherwise I am not aware of any functional reason to prefer one over the other.
I believe "NOW()" should work in your query, but it would just be a literal function call in the query, not any sort of input parameter.
$sql = "INSERT INTO profile (email,pass,date) VALUES (:email,:hash,NOW())";