【发布时间】:2013-08-28 20:09:19
【问题描述】:
有没有办法在 Teradata SQL 中确定一年的第一天?
例如,我用它来查找一个月的第一天:
SELECT dt + (1 - EXTRACT(DAY FROM dt)) AS dt
我知道我可以使用YEAR() 直接提取年份,但我想将结果输出为日期,以便在一些外部图表中使用。
我试过了,但它在日期的开头添加了一堆空格:
CONCAT(YEAR(dt),'-01-01')
【问题讨论】:
有没有办法在 Teradata SQL 中确定一年的第一天?
例如,我用它来查找一个月的第一天:
SELECT dt + (1 - EXTRACT(DAY FROM dt)) AS dt
我知道我可以使用YEAR() 直接提取年份,但我想将结果输出为日期,以便在一些外部图表中使用。
我试过了,但它在日期的开头添加了一堆空格:
CONCAT(YEAR(dt),'-01-01')
【问题讨论】:
dnoeth 的方法对于工作的长期优化来说很酷,但是,在我看来,简单的答案是 Jeffrey 的方法或以下方法。不确定哪一个使用的资源更少:
select cast(extract(year from current_date)||'0101' as date format 'yyyymmdd');
【讨论】:
简洁优雅 TRUNC(current_date, 'Y')
【讨论】:
想通了:
ADD_MONTHS(dt, -(EXTRACT(MONTH FROM dt) - 1)) + (1 - EXTRACT(DAY FROM dt))
【讨论】:
最高效的方式是基于内部存储,可以轻松放入SQL-UDF:
REPLACE FUNCTION first_day_of_year(yr INTEGER)
RETURNS DATE
SPECIFIC first_day_of_year_INT
RETURNS NULL ON NULL INPUT
CONTAINS SQL
DETERMINISTIC
COLLATION INVOKER
INLINE TYPE 1
RETURN
(yr - 1900) * 10000 + 101 (DATE)
;
REPLACE FUNCTION first_day_of_year(cdate DATE)
RETURNS DATE
SPECIFIC first_day_of_year_DT
RETURNS NULL ON NULL INPUT
CONTAINS SQL
DETERMINISTIC
COLLATION INVOKER
INLINE TYPE 1
RETURN
first_day_of_year(EXTRACT(YEAR FROM cdate))
;
编辑:
自 TD14.10 以来,TRUNC(dt, 'Y')
【讨论】:
试试这个。
选择日期- dayofyear(date)+1
【讨论】: