假设我有一系列名为 name_YYYY_WW
的 SQL 表,其中 YYYY = 年,WW = 周数。如果我调用一个将用户定义的日期引导到正确表的函数。
如果输入的日期"20110101"
:
SELECT EXTRACT (WEEK FROM DATE '20110101')
返回 52 和
SELECT EXTRACT (YEAR FROM DATE '20110101')
回归2011年。
虽然这些结果没有错,但我希望"20110101"
指向表name_2010_52
或name_2011_01
,而不是像现在这样name_2011_52
当我合并结果以形成表的查询时。
这个问题有什么优雅的解决方案吗?
函数 to_char() 将允许您格式化日期或时间戳以输出正确的 iso 周和 iso 年。
SELECT to_char('2011-01-01'::date, 'IYYY_IW') as iso_year_week;
将产生:
iso_year_week
---------------
2010_52
(1 row)
您可以使用 CASE:
WITH sub(field) AS (
SELECT CAST('20110101' AS date) -- just to test
)
SELECT
CASE
WHEN EXTRACT (WEEK FROM field ) > 1 AND EXTRACT (MONTH FROM field) = 1 AND EXTRACT (DAY FROM field) < 3 THEN 1
ELSE
EXTRACT (WEEK FROM field)
END
FROM
sub;