【问题标题】:How to select all months of the current year with number of days如何用天数选择当年的所有月份
【发布时间】:2022-01-02 02:09:20
【问题描述】:

我尝试创建一个 SQL 语句,它选择当前年份的所有月份以及天数。

我不知道从哪里开始。

我明白了:

SELECT to_char(date, 'YYYY-MM-DD') AS YearMonth
FROM date_table
WHERE YearMonth LIKE ('2021%')

但是,我得到了输出

YearMonth 
2
7
3
9
11

如何让它看起来像这样:

02
07
03
09
11

我如何知道月份有多少天?

【问题讨论】:

  • 事先知道查询答案的唯一真正障碍是闰年。在闰年,二月有 29 天,否则有 28 天。所以,如果你能跟踪闰年,你就知道每个月有多少天。
  • 对于前导零,可以使用LPAD
  • 在同一个文档中,您可以找到td_month_end,例如SELECT TD_MONTH_END(DATE'2012-01-15',NULL);,它返回12/01/31

标签: sql teradata


【解决方案1】:

使用内置日历表和 lpad 获取前导零:

select
lpad(cast(month_of_year as varchar(2)),2,'0'),
count (*)
from
sys_calendar.calendar
where
extract(year from current_date) = year_of_Calendar
group by 1
order by 1

【讨论】:

    【解决方案2】:

    根据今天创建月份列表,可以是字符串或数字:

    SELECT
       To_Char(Last(pd), 'mm-dd')   AS mmdd
      ,Extract(MONTH From Last(pd)) AS mm
      ,Extract(DAY From Last(pd))   AS dd
    FROM 
     ( -- EXPAND ON requires FROM and TRUNC materializes the FROM avoiding error
       -- "9303 EXPAND ON clause must not be specified in a query expression with no table references."
       SELECT Trunc(Current_Date, 'YYYY') AS start_date
     ) AS dt
    EXPAND ON PERIOD(start_date, start_date + INTERVAL '1' YEAR) AS pd
           BY INTERVAL '1' MONTH
    

    这可以很容易地包装在派生表或 CTE 中以在 Select 中使用。但是根据您真正想要实现的目标,可能会有更好的解决方案,例如直接应用 EXPAND ON 或使用时间序列聚合

    【讨论】:

      【解决方案3】:

      试试这个

      SELECT lpad(cast(to_char(date,'MM') as varchar(2)),2,'0') AS YearMonth,
      EXTRACT(DAY FROM LAST_DAY(date)) days_in_month
      FROM date_table
      WHERE to_char(date, 'YYYY') ='2021'
      

      见 (https://downloads.teradata.com/forum/general/get-the-number-of-days-in-a-month)

      【讨论】:

      • 语法错误:预期在 '(' 和 'year' 关键字之间有一些东西......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 2015-09-28
      • 2017-10-19
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      相关资源
      最近更新 更多