如何从 postgresql 中的工作日编号获取日期名称?

How to get day name from weekday number in postgresql?

我有一个 table,工作日存储为整数,0 到 6。

我需要什么函数来创建与这些日期数字相关的日期名称?

例如:0 -> 周日,1->周一,等等

喜欢:

SELECT magic(my_day_number) FROM my_table;
Mon

一个简单有效的方法使用case代替日期操作例程:

select case my_day_number
    when 0 then 'Sun'
    when 1 then 'Mon'
    when 2 then 'Tue'
    ...
    when 6 then 'Sat'
end my_day_name from mytable

Postgres 可以 return 此日期信息。

您可以将这些天转换为日期,然后提取日期名称。它的好处是允许 .

使用 2017 年是因为 1 月 1 日是星期日(第 0 天),格式 IDDD 将第 1 天视为一年中的第一个星期一。

WITH myTable(my_day_number) as (values (0),(1),(2),(3),(4),(5),(6))
SELECT to_char(to_date(my_day_number||'-2017','IDDD-IYYY'), 'Day')
FROM mytable;

  to_char
-----------
 Sunday
 Monday
 Tuesday
 Wednesday
 Thursday
 Friday
 Saturday

其他答案很好,但老实说,我建议在应用层而不是在数据库中这样做。

  1. 这是全局常量信息。
  2. 数据极少。只有 0 到 6。
  3. 数据库中的星期几已充分建模为 0 到 6。
  4. 格式可能会有所不同:M、Mo、Mon、Monday。
  5. 星期几可以说更容易本地化为其他语言。
  6. 应用程序层比数据库更容易扩展。
  7. 以上所有甚至可以推迟到客户端rendering/localization。

格式化为日期名称不会提高规范化或查询速度,因此可以说不属于数据库。但是如果你坚持为此使用数据库层,不可变函数可能是可行的方法。

CREATE OR REPLACE FUNCTION day_name(day_index integer)
RETURNS text LANGUAGE sql STRICT IMMUTABLE PARALLEL SAFE AS $$
  SELECT CASE day_index
    WHEN 0 THEN 'Sun'
    WHEN 1 THEN 'Mon'
    WHEN 2 THEN 'Tue'
    WHEN 3 THEN 'Wed'
    WHEN 4 THEN 'Thu'
    WHEN 5 THEN 'Fri'
    WHEN 6 THEN 'Sat'
    END;
$$;

我将函数称为 day_name 是为了更具描述性,希望它的实现方式看起来不会很神奇。通过使函数 IMMUTABLE,一旦数据库计算一次,它就可以使用缓存的结果,大大提高了临时一次性查询的速度。

这就是我要使用的:

select ('{Sun,Mon,Tue,Wed,Thu,Fri,Sat}'::text[])[extract(dow from now()) + 1] as day_of_week;

或者如果您更喜欢函数:

CREATE OR REPLACE FUNCTION dow_name(p_index integer)
RETURNS text LANGUAGE sql STRICT IMMUTABLE PARALLEL SAFE AS
$$
  SELECT (array['Sun','Mon','Tue','Wed','Thu','Fri','Sat'])[p_index + 1];
$$;

与使用 CASE 块相比,'{...}'::text[]array[...] 的两个选项(在 Postgres 12 上)工作速度快 8%。