【问题标题】:Using Oracle SQL, how does one output day number of week and day of week?使用Oracle SQL,如何输出星期几和星期几?
【发布时间】:2013-01-09 04:16:29
【问题描述】:

使用 Oracle SQL,如何创建结果集:

  • 星期几的数字 (1-7)
  • 当天的名称(周一、周二、周三等)

例如:

日期名称 1 星期一 2 星期二 3 星期三 4 星期四 5 星期五 6 星期六 7 星期日

【问题讨论】:

  • 这原本是一个措辞非常糟糕的问题。但是,它已经过编辑和澄清,现在是一个非常有用的问题。此页面上的答案对我简化(最初)困难的 Oracle 问题有很大帮助。这些答案在其他地方不可用。这个问题值得重新评估并可能重新打开。
  • 这是一个真正的问题。

标签: sql oracle


【解决方案1】:

不改变会话

 CASE 
    WHEN to_char(sysdate, 'd')-1 = 0 THEN 7 
    ELSE to_char(sysdate, 'd')-1 
 END 

【讨论】:

    【解决方案2】:

    Florin 的回答是我会怎么做,但您需要对NLS 设置小心一点。星期几受 NLS 领土的影响,所以如果我像在美国一样运行它,它会起作用:

    alter session set nls_territory = 'AMERICA';
    
    select to_char(sysdate, 'D') as d, to_char(sysdate, 'Day') as day from dual;
    
    D DAY
    - ------------------------------------
    6 Friday
    
    select level as dow,
        to_char(trunc(sysdate ,'D') + level, 'Day') as day
    from dual
    connect by level <= 7;
    
    DOW DAY
    --- ------------------------------------
      1 Monday
      2 Tuesday
      3 Wednesday
      4 Thursday
      5 Friday
      6 Saturday
      7 Sunday
    

    但是在英国运行相同的查询是休息一天:

    alter session set nls_territory = 'UNITED KINGDOM';
    
    select to_char(sysdate, 'D') as d, to_char(sysdate, 'Day') as day from dual;
    
    D DAY
    - ------------------------------------
    5 Friday
    
    select level as dow,
        to_char(trunc(sysdate ,'D') + level, 'Day') as day
    from dual
    connect by level <= 7;
    
    DOW DAY
    --- ------------------------------------
      1 Tuesday
      2 Wednesday
      3 Thursday
      4 Friday
      5 Saturday
      6 Sunday
      7 Monday
    

    ...我需要调整计算以纠正这一点:

    select level as dow,
        to_char(trunc(sysdate ,'D') + level - 1, 'Day') as day
    from dual
    connect by level <= 7;
    
    DOW DAY
    --- ------------------------------------
      1 Monday
      2 Tuesday
      3 Wednesday
      4 Thursday
      5 Friday
      6 Saturday
      7 Sunday
    

    如果需要,您还可以单独指定用于日期名称的语言:

    select level as dow,
        to_char(trunc(sysdate ,'day') + level - 1, 'Day',
            'NLS_DATE_LANGUAGE=FRENCH') as day
    from dual
    connect by level <= 7;
    
    DOW DAY
    --- --------------------------------
      1 Lundi
      2 Mardi
      3 Mercredi
      4 Jeudi
      5 Vendredi
      6 Samedi
      7 Dimanche
    

    to_char() with nls_date_languageday of the week 的文档以及the globalisation support guide 中的更多内容。

    【讨论】:

    • 这个似乎对我有用to_char(vdate,'DAY', 'NLS_DATE_LANGUAGE=''numeric date language''')
    • @TecHunter - 我认为这仍然没有记录(奇怪的是 Fusion 除外),所以我会警惕在生产代码中使用它。
    【解决方案3】:
    select level as dow, 
        to_char(level+trunc(sysdate,'D'),'Day') as day
    from dual
    connect by level <= 7;
    

    【讨论】:

      【解决方案4】:
      Select 1, 'Monday' from dual union all select 2, 'Tuesday' from dual ...
      

      【讨论】:

      • 感谢您的回复。有没有不使用UNION的另一种方法。
      猜你喜欢
      • 2015-05-13
      • 2022-08-10
      • 2013-12-31
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 2016-10-22
      • 2015-07-24
      • 2021-06-29
      相关资源
      最近更新 更多