【问题标题】:How to return weekday name from date如何从日期返回工作日名称
【发布时间】:2020-01-12 06:09:49
【问题描述】:

我正在尝试在我现有的日期列旁边添加一个列,该列给出了一周中某一天的相应名称。

SELECT DISTINCT
a.transaction_date,
to_char(date 'a.transaction_date','DAY') as Day
FROM transactions_table a

尝试:周一、周二、周三等。遗憾的是,数据库正在返回 ORA-01841 错误。通常,我的日期列会返回这样的日期:dd-mmm-yy

【问题讨论】:

  • a.transaction_date 是什么数据类型?为什么你把它放在单引号里,当它是一个列时,试着让它成为日期 literal 的一部分?
  • 另外,您使用了 DAY 格式模型并两次引用了一天 name;但随后显示了日期缩写(星期一而不是星期一)。你真正想要哪个?是全大写还是混合大小写?
  • 是的,我不应该有单引号,因为该字段是 DATE 字段。完整的大写名称就可以了。

标签: sql oracle


【解决方案1】:

你可以试试Dy模式:

select to_char(transaction_date,'Dy') 
  from transactions_table

如果您需要不同的语言,请考虑第三个参数:

select to_char(transaction_date,'Dy','nls_date_language=turkish')
  from transactions_table

附注我在第一个查询中认为英语是默认语言,如果它不是您的数据库的默认语言,那么通过将turkish 替换为english 来考虑第二个查询。

【讨论】:

  • 不客气@Roostir,如果你觉得答案有帮助,请采纳,这样,问题就被认为是解决了。
【解决方案2】:

试试下面 -

SELECT DISTINCT
a.transaction_date,
to_char(date a.transaction_date,'DAY') as Day
FROM transactions_table a

【讨论】:

  • to_char() 函数内部有一个虚假的DATE 关键字,DAY 格式模型将返回当天的全名,而不是三个字母的缩写版本。
【解决方案3】:

date 'a.transaction_date' 试图将 date literal 与可变列值混合,但随后还将列名放在单引号内,您最终会做:

to_date('a.transaction_date', 'YYYY-MM-DD')

它也会得到 ORA-01841,原因可能更清楚。

如果transaction_date 已经是一个日期,那么只需引用它:

SELECT DISTINCT
a.transaction_date,
to_char(a.transaction_date,'DAY') as Day
FROM transactions_table a

如果它是一个字符串 - 它不应该是! - 然后将该值正确转换为日期:

SELECT DISTINCT
a.transaction_date,
to_char(to_date(a.transaction_date, 'YYYY-MM-DD'),'DAY') as Day
FROM transactions_table a

...或使用任何适当的格式掩码。

还要注意DAY(以及缩写的DY,或Dy,这可能是您真正想要的)输出取决于您的NLS日期语言,但如果您希望它始终如此,您可以覆盖它用英文,例如:

SELECT DISTINCT
a.transaction_date,
to_char(a.transaction_date,'DY','NLS_DATE_LANGUAGE=ENGLISH') as Day
FROM transactions_table a

使用 CTE 的快速演示:

-- CTE for dummy date
with transactions_table(transaction_date) as (
  select date '2019-01-01' from dual
  union all
  select date '2019-09-01' from dual
)
-- actual query
SELECT DISTINCT
a.transaction_date,
to_char(a.transaction_date,'Dy','NLS_DATE_LANGUAGE=ENGLISH') as Day
FROM transactions_table a
/

TRANSACTIO DAY         
---------- ------------
2019-01-01 Tue         
2019-09-01 Sun         

【讨论】:

    【解决方案4】:

    查看Format Models

    SELECT DISTINCT
    a.transaction_date,
    to_char(a.transaction_date, 'DY') as Day_Abbr, -- This will print out an abbriviation like "MO" for Monday
    to_char(a.transaction_date, 'DAY') as Day, -- This will print out a whole day, like "MONDAY"
    substr(to_char(a.transaction_date, 'DAY'),1,3) as Day_My_Abbr -- This will print out your wanted abbriviation, like "MON"
    FROM transactions_table a
    

    【讨论】:

    • 'MONTAG' 缩写为'MO';如果日期语言设置为英语,那么你会得到“星期一”和“星期一”——不需要 substr。 (OP显示了英文缩写,所以我假设这是他们默认使用的语言......)
    【解决方案5】:

    我认为 transaction_date 是一个日期数据类型...

    SELECT DISTINCT
    a.transaction_date,
    to_char(a.transaction_date,'DAY') as Day
    FROM transactions_table a
    

    如果它是 varchar2,那么您可以先将其转换为日期,使用您的日期格式

    SELECT DISTINCT
    a.transaction_date,
    to_char(to_date(a.transaction_date, 'dd/mm/yyyy'),'DAY') as Day
    FROM transactions_table a
    

    例如:

    select to_char(to_date('08/09/2019', 'dd/mm/yyyy'),'DAY') as Day from dual;
    

    【讨论】:

    • 'a.transaction_date' 是一个字符串文字。没有单引号的是表别名和列名。此外,DAY 格式模型将返回当天的全名,而不是名称的缩写。
    • 是的,它是 DATE 类型。您的第一个解决方案有效。谢谢!
    猜你喜欢
    • 2011-12-21
    • 2021-11-02
    • 1970-01-01
    • 2021-08-22
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    相关资源
    最近更新 更多