Sql 按星期天排序-解码返回空值

Sql 按星期天排序-解码返回空值,sql,sorting,oracle11g,Sql,Sorting,Oracle11g,我需要从EMPLOYEES表中获取一些数据,并根据雇用日期创建名为week的新列。然后,结果必须按一周中的哪一天(从周一到周日)排序,这就是我的问题所在 我决定使用解码功能,但似乎我做错了什么 这是我的问题 SELECT FIRST_NAME, LAST_NAME, HIRE_DATE, TO_CHAR(HIRE_DATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH') AS DAY_OF_WEEK FROM EMPLOYEES ORDER BY DECODE(DAY_

我需要从EMPLOYEES表中获取一些数据,并根据雇用日期创建名为week的新列。然后,结果必须按一周中的哪一天(从周一到周日)排序,这就是我的问题所在

我决定使用解码功能,但似乎我做错了什么

这是我的问题

SELECT FIRST_NAME, LAST_NAME, HIRE_DATE, TO_CHAR(HIRE_DATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH') AS DAY_OF_WEEK FROM EMPLOYEES ORDER BY DECODE(DAY_OF_WEEK,'MONDAY',1,'TUESDAY',2,'WEDNESDAY',3,'THURSDAY',4,'FRIDAY',5,'SATURDAY',6,'SUNDAY',7)
除了分类,一切都很好。星期三在乞讨处,其余的按随机顺序排列

我对查询做了一点修改,所以我可以看到这个函数是如何工作的

SELECT FIRST_NAME, LAST_NAME, HIRE_DATE, TO_CHAR(HIRE_DATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH') AS DAY_OF_WEEK, DECODE(TO_CHAR(HIRE_DATE, 'D', 'NLS_DATE_LANGUAGE=ENGLISH'), 'MONDAY',1, 'TUESDAY',2,  'WEDNESDAY',3,  'THURSDAY',4,  'FRIDAY',5,  'SATURDAY',6,  'SUNDAY',7) AS DAY2 FROM EMPLOYEES ORDER BY DECODE(DAY_OF_WEEK, 'MONDAY',1, 'TUESDAY',2,  'WEDNESDAY',3,  'THURSDAY',4,  'FRIDAY',5,  'SATURDAY',6,  'SUNDAY',7)
类似的内容在第2天第3列中返回星期三,在其他所有内容中返回(null)


这就是为什么排序不起作用的原因,但我仍然不知道为什么排序不起作用,也不知道查询中的错误在哪里:)

问题是一天中充满了空格。“星期三”匹配,因为它是最长的工作日名称。如果您这样做,您可以看到:

SELECT '|' || TO_CHAR(HIRE_DATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH') || '|'
FROM EMPLOYEES ;
如果您可以使用星期几缩写:

SELECT FIRST_NAME, LAST_NAME, HIRE_DATE,
       TO_CHAR(HIRE_DATE, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') AS DAY_OF_WEEK
FROM EMPLOYEES
ORDER BY DECODE(DAY_OF_WEEK, 'MON', 1, 'TUE', 2, 'WED', 3, 'THU', 4, 'FRI', 5, 'SAT', 6, 'SUN', 7);

我更喜欢ANSI标准的
CASE
而不是
DECODE()
,但两者都适用于这种情况。

问题是一天中充满了空格。“星期三”匹配,因为它是最长的工作日名称。如果您这样做,您可以看到:

SELECT '|' || TO_CHAR(HIRE_DATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH') || '|'
FROM EMPLOYEES ;
如果您可以使用星期几缩写:

SELECT FIRST_NAME, LAST_NAME, HIRE_DATE,
       TO_CHAR(HIRE_DATE, 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') AS DAY_OF_WEEK
FROM EMPLOYEES
ORDER BY DECODE(DAY_OF_WEEK, 'MON', 1, 'TUE', 2, 'WED', 3, 'THU', 4, 'FRI', 5, 'SAT', 6, 'SUN', 7);

我更喜欢ANSI标准的
CASE
而不是
DECODE()
,但两者都在这种情况下工作。

这使得逻辑更难理解,但满足了需要

“IW”与ISO周的第一天(即周一)在一周的同一天

with EMPLOYEES as (
SELECT 'Paul1' First_Name, 'Revere' Last_name, To_date('1-MAR-2016') Hire_Date FROM DUAL UNION ALL
SELECT 'Paul2', 'Revere', to_date('2-MAR-2016') FROM DUAL UNION ALL
SELECT 'Paul3', 'Revere', to_date('3-MAR-2016') FROM DUAL UNION ALL
SELECT 'Paul4', 'Revere', to_date('4-MAR-2016') FROM DUAL UNION ALL
SELECT 'Paul5', 'Revere', to_date('5-MAR-2016') FROM DUAL UNION ALL
SELECT 'Paul6', 'Revere', to_date('6-MAR-2016') FROM DUAL UNION ALL
SELECT 'Paul7', 'Revere', to_date('7-MAR-2016') FROM DUAL)

SELECT FIRST_NAME, LAST_NAME, HIRE_DATE
, TO_CHAR(HIRE_DATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH') AS DAY_OF_WEEK
FROM EMPLOYEES 
order by TRUNC (Hire_Date) - TRUNC (Hire_Date, 'IW')

这使得逻辑更难理解,但满足了需要

“IW”与ISO周的第一天(即周一)在一周的同一天

with EMPLOYEES as (
SELECT 'Paul1' First_Name, 'Revere' Last_name, To_date('1-MAR-2016') Hire_Date FROM DUAL UNION ALL
SELECT 'Paul2', 'Revere', to_date('2-MAR-2016') FROM DUAL UNION ALL
SELECT 'Paul3', 'Revere', to_date('3-MAR-2016') FROM DUAL UNION ALL
SELECT 'Paul4', 'Revere', to_date('4-MAR-2016') FROM DUAL UNION ALL
SELECT 'Paul5', 'Revere', to_date('5-MAR-2016') FROM DUAL UNION ALL
SELECT 'Paul6', 'Revere', to_date('6-MAR-2016') FROM DUAL UNION ALL
SELECT 'Paul7', 'Revere', to_date('7-MAR-2016') FROM DUAL)

SELECT FIRST_NAME, LAST_NAME, HIRE_DATE
, TO_CHAR(HIRE_DATE, 'DAY', 'NLS_DATE_LANGUAGE=ENGLISH') AS DAY_OF_WEEK
FROM EMPLOYEES 
order by TRUNC (Hire_Date) - TRUNC (Hire_Date, 'IW')

因为您不返回日数,所以不需要
1+
:-)因为您不返回日数,所以不需要
1+
:-)您是对的!我不知道名字后面有空格。至于缩写词,我认为它们已经足够好了,所以我可以用它们来代替全名:)非常感谢!我总是想知道为什么。。。填充空间解释了这一点。你是对的!我不知道名字后面有空格。至于缩写词,我认为它们已经足够好了,所以我可以用它们来代替全名:)非常感谢!我总是想知道为什么。。。填充空间解释了这一点。