Many languages have a substring function, either built-in or in the standard
library. All have the string as the first parameter, and the second parameter
is always where the second string starts. But for the third parameter there is a
mix: some go with closing position, other languages requires you to specify the
length of the substring. T-SQL is of the latter school.
Depending on context both methods can be preferable. I have however
found that in T-SQL using substring can be quite bulky to use because of
the last parameter. For instance, consider extracting the SQL statement
for a query from dm_exec_query_stats and dm_exec_sql_text. query_stats
returns two offsets, and not a start and a length.