如何从 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
其他答案很好,但老实说,我建议在应用层而不是在数据库中这样做。
- 这是全局常量信息。
- 数据极少。只有 0 到 6。
- 数据库中的星期几已充分建模为 0 到 6。
- 格式可能会有所不同:M、Mo、Mon、Monday。
- 星期几可以说更容易本地化为其他语言。
- 应用程序层比数据库更容易扩展。
- 以上所有甚至可以推迟到客户端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%。
我有一个 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
其他答案很好,但老实说,我建议在应用层而不是在数据库中这样做。
- 这是全局常量信息。
- 数据极少。只有 0 到 6。
- 数据库中的星期几已充分建模为 0 到 6。
- 格式可能会有所不同:M、Mo、Mon、Monday。
- 星期几可以说更容易本地化为其他语言。
- 应用程序层比数据库更容易扩展。
- 以上所有甚至可以推迟到客户端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%。