Sql 按星期天排序-解码返回空值
我需要从EMPLOYEES表中获取一些数据,并根据雇用日期创建名为week的新列。然后,结果必须按一周中的哪一天(从周一到周日)排序,这就是我的问题所在 我决定使用解码功能,但似乎我做错了什么 这是我的问题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_
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+
:-)您是对的!我不知道名字后面有空格。至于缩写词,我认为它们已经足够好了,所以我可以用它们来代替全名:)非常感谢!我总是想知道为什么。。。填充空间解释了这一点。你是对的!我不知道名字后面有空格。至于缩写词,我认为它们已经足够好了,所以我可以用它们来代替全名:)非常感谢!我总是想知道为什么。。。填充空间解释了这一点。