如果今天是星期一,则Oracle sql在“星期一”字段中获取值为的用户

如果今天是星期一,则Oracle sql在“星期一”字段中获取值为的用户,sql,oracle,Sql,Oracle,我有一个表,它有一周中每一天的字段名。我正在尝试编写一个sql查询,该查询将获取当前工作日的“星期几”字段中没有空值的所有用户 例如,从我的表中获取所有用户,如果今天是星期一,“星期一”字段不为空 它将每天运行,因此它需要评估每天是星期几,并获取当天的相应用户 我发现此代码段用于获取星期几,但我不确定如何在另一个select语句中使用: select to_char(sysdate,'D') from dual 任何帮助都将不胜感激 编辑以添加示例数据和输出: USER | 123456 SU

我有一个表,它有一周中每一天的字段名。我正在尝试编写一个sql查询,该查询将获取当前工作日的“星期几”字段中没有空值的所有用户

例如,从我的表中获取所有用户,如果今天是星期一,“星期一”字段不为空

它将每天运行,因此它需要评估每天是星期几,并获取当天的相应用户

我发现此代码段用于获取星期几,但我不确定如何在另一个select语句中使用:

select to_char(sysdate,'D') from dual
任何帮助都将不胜感激

编辑以添加示例数据和输出:

USER | 123456
SUNDAY | 
MONDAY | 18
TUESDAY | 
WEDNESDAY | 15
THURSDAY | 
FRIDAY | 
SATURDAY | 11   
 ---
USER | 789023
SUNDAY | 18
MONDAY | 
TUESDAY | 3
WEDNESDAY | 15
THURSDAY | 
FRIDAY | 
SATURDAY | 11
因此,周一的产出将是:

  USER | 123456         
 USER | 789023  
周二的产出将是:

  USER | 123456         
 USER | 789023  

此查询返回缩写的日Sun-Sat:

select to_char(sysdate,'DY') from dual;
它更容易测试

您可以编写返回正确列的查询,如下所示:

select case to_char(sysdate,'DY') 
    when 'MON' then monday
    when 'TUE' then tuesday
    when 'WED' then wednesday
    when 'THU' then thursday
    when 'FRI' then friday
    when 'SAT' then saturday
    when 'SUN' then sunday
    else NULL
end 
from yourtable;
通过使用“按级别连接”,您可以获得一周中具有相应数字的天数:

select to_char(sysdate+level,'D','NLS_DATE_LANGUAGE=Turkish') "Day No", 
       to_char(sysdate+level,'Day','NLS_DATE_LANGUAGE=Turkish') "Day(Of Week)"
  from dual 
connect by level <= 7 
order by 1;
此外,还可以创建一个视图,以使用诸如表之类的值,因为NLS_DATE_语言参数可能与您的本地设置相关:

你可以用这个:

假设您的表有7列,分别命名为sunday、monday

您可以使用TRUNC SYSDATE-TRUNC SYSDATE,“IW”将一周中的某一天设置为数字0=周一,6=周日,这与NLS会话参数无关

使用:

对于_CHAR datavalue,“D”将给出不同地区一周中不同的第一天;和 对于_CHAR datevalue,“DAY”将以不同的语言给出不同的值; 但使用TRUNC datevalue,“IW”与所有这些问题无关。 Oracle 11g R2架构设置:

问题1:

:


如果您希望坚持使用日期名称而不是计算的偏移量,您可以使用@MTO指出的方法来避免:

to_char(sysdate, 'FMDAY', 'NLS_DATE_LANGUAGE=ENGLISH'
我会用英语给你全天的名字。请注意,您不能使用它来获取特定于查询的D元素解释;此外,FM删除了通常的右填充,使所有名称的长度相同;在这里并不重要

作为CTE中数据的演示,列名更改为有效:

with your_table (user_id, sunday, monday, tuesday, wednesday, thursday, friday, saturday)
as (
            select 123456, null, 18, null, 15, null, null, 11 from dual
  union all select 789023, 18, null, 3, 15, null, null, 11 from dual
)
select user_id
from your_table
where case to_char(sysdate, 'FMDAY', 'NLS_DATE_LANGUAGE=ENGLISH')
    when 'SUNDAY' then sunday
    when 'MONDAY' then monday
    when 'TUESDAY' then tuesday
    when 'WEDNESDAY' then wednesday
    when 'THURSDAY' then thursday
    when 'FRIDAY' then friday
    when 'SATURDAY' then saturday
  end is not null;

   USER_ID
----------
    123456
    789023

今天是星期三,这两个用户都能找到。

请提供样本数据和该数据的预期输出。@PhamX.Bach-addy您的数据似乎很奇怪。第一列是表列,第二列是表行?谢谢,您能解释一下这是如何让用户获得今天的值的吗?TO_CHAR datevalue,“DY”取决于NLS_DATE_LANGUAGE的“session”参数。用户可以在自己的会话中更改此参数,并根据安装数据库时的位置使用不同的默认值,因此此方法在国际上使用时会出现问题。to_CHAR datevalue,“D”取决于NLS_TERRITORY session参数,不同的TERRITORY在一周中的第一天不同。对于CHAR datevalue,“DAY”取决于NLS\u DATE\u语言会话参数。用户可以在自己的会话中设置这两个参数,因此此方法在国际上使用时会有问题。@MT0我知道,这取决于NLS_区域,但在这种情况下没有区别,只要DBA根据本地约定设置NLS_区域参数。我的意思是,这不是软件开发人员的任务,而是DBA的任务。顺便说一句,问题变得与以前大不相同了。没有-服务器上没有任何更改,但是用户更改了自己的会话参数,查询现在给出了不同的结果。服务器设置是什么并不重要,因为用户的会话参数将覆盖它们。@MT0我说的是同样的事情,但不是软件开发人员的任务。好的,那是一种不同的风格,另一种可能是相当可观的。我明白了,您的意思是:在TO_CHAR的第三个参数中使用显式NLS参数是解决问题的一种方法,但是您需要始终包含该参数,而不是会话默认值,并确保查询用户始终使用一致的参数值。当查询将在国际上运行时,您应该更新您的答案,将此作为解决方案。to_CHAR datevalue,“D”取决于NLS_TERRITORY session参数,并且不同的TERRITORY在一周中有不同的第一天。用户可以在自己的会话中更改此参数,并根据安装数据库时的位置使用不同的默认值,因此此方法在国际上使用时会出现问题。@TM3运行ALTER SESSION SET NLS_TERRITORY='DENMARK';你会得到一个错误的一天的结果,因为星期一是丹麦和许多其他地区的第一天。@ TM3就像在@ MTO的评论中,你应该考虑使用Tunc SyDeas-Tunc SysDead,“IW”进行比较,因为我的查询在数据库变为MAU时输出错误结果的风险有风险。 在OS`中通过diffirent配置联合设置NLS_TERRITORY或当您更改为使用来自其他提供程序的数据库时。提到
|   USER | VALUE |
|--------|-------|
| 123456 |    15 |
| 789023 |    15 |
to_char(sysdate, 'FMDAY', 'NLS_DATE_LANGUAGE=ENGLISH'
with your_table (user_id, sunday, monday, tuesday, wednesday, thursday, friday, saturday)
as (
            select 123456, null, 18, null, 15, null, null, 11 from dual
  union all select 789023, 18, null, 3, 15, null, null, 11 from dual
)
select user_id
from your_table
where case to_char(sysdate, 'FMDAY', 'NLS_DATE_LANGUAGE=ENGLISH')
    when 'SUNDAY' then sunday
    when 'MONDAY' then monday
    when 'TUESDAY' then tuesday
    when 'WEDNESDAY' then wednesday
    when 'THURSDAY' then thursday
    when 'FRIDAY' then friday
    when 'SATURDAY' then saturday
  end is not null;

   USER_ID
----------
    123456
    789023