SQL技术问询:排查查询周二入职员工并按姓氏降序排序的SQL问题
你的SQL语句存在两个关键问题
DAY格式返回带尾随空格:在Oracle等多数数据库中,TO_CHAR(hire_date, 'DAY')会返回填充了空格的星期名称,长度对齐到当前数据库配置里最长的星期名。比如'TUESDAY'实际会是'TUESDAY '(末尾带空格),直接用= 'TUESDAY'会因为空格不匹配,查不到任何结果。- 依赖数据库语言环境:如果数据库的日期语言配置(比如Oracle的
NLS_DATE_LANGUAGE)不是英文,TO_CHAR返回的星期名会是对应语言的翻译(比如法语的'MARDI'),这时候和'TUESDAY'对比自然匹配不上。
修正方法
推荐两种更可靠的写法:
- 用
TRIM去掉空格:
SELECT last_name, hire_date FROM employees WHERE TRIM(TO_CHAR(hire_date, 'DAY')) = 'TUESDAY' ORDER BY last_name DESC;
- 用数字格式匹配星期几(不受语言和空格影响,注意不同数据库的星期起始值):
-- Oracle 环境(周日为一周第1天,周二是3) SELECT last_name, hire_date FROM employees WHERE TO_CHAR(hire_date, 'D') = '3' ORDER BY last_name DESC; -- PostgreSQL 环境(周一为一周第1天,周二是2) SELECT last_name, hire_date FROM employees WHERE EXTRACT(DOW FROM hire_date) = 2 ORDER BY last_name DESC;
内容的提问来源于stack exchange,提问作者Magdalena
相关产品推荐
相关产品推荐

