SQL: 你如何获取一个月的第一天?
SQL: how do you fetch a first day of the month?
SQL: 如何获取一个月的第一天?
嗨,
我需要从 start_date 列的 tbl.date 中获取每个月的第一天。
11/1/2017
12/1/2017
1/1/2018
2/1/2018
ETC.
谢谢
ANSI SQL 中的一个解决方案如下所示:
select dte - (1 - extract(day from dte)) * interval '1 day'
在 SQL 服务器中,这将是:
select dateadd(day, 1 - day(dte), dte)
几乎所有数据库都提供类似的功能。
如果您只想要该月第一天的行,则:
where extract(day from dte) = 1
在 SQL 服务器中,这将是:
where day(dte) = 1
当然,语法可能因数据库而异。
另一个解决方案,使用 Postgres,如果您需要 select 每个月的第一行,如果不能保证那将是该月的第一天:
CREATE TABLE dates (
id BIGSERIAL PRIMARY KEY,
date TIMESTAMP NOT NULL
);
INSERT INTO dates(date)
VALUES ('2017-05-05'::timestamp), ('2017-05-02'::timestamp), ('2017-05-30'::timestamp), ('2017-05-25'::timestamp), ('2017-05-15'::timestamp), ('2017-05-01'::timestamp), ('2017-06-10'::timestamp), ('2017-06-02');
SELECT DISTINCT ON(EXTRACT(MONTH FROM date), EXTRACT(YEAR FROM date)) date
FROM dates
ORDER BY EXTRACT(MONTH FROM date), EXTRACT(YEAR FROM date), date ASC;
结果:
date
--------------------
2017-05-01T00:00:00Z
2017-06-02T00:00:00Z
另一个解决方案,使用 Sql 服务器
声明@FirstDOM 日期,@LastDOM 日期时间
set @FirstDOM = (select dateadd(d,-1,dateadd(mm,datediff(m,0,getdate()),1 )))
SELECT CONVERT( varchar, @FirstDOM,101);
SQL: 如何获取一个月的第一天?
嗨,
我需要从 start_date 列的 tbl.date 中获取每个月的第一天。
11/1/2017
12/1/2017
1/1/2018
2/1/2018
ETC.
谢谢
ANSI SQL 中的一个解决方案如下所示:
select dte - (1 - extract(day from dte)) * interval '1 day'
在 SQL 服务器中,这将是:
select dateadd(day, 1 - day(dte), dte)
几乎所有数据库都提供类似的功能。
如果您只想要该月第一天的行,则:
where extract(day from dte) = 1
在 SQL 服务器中,这将是:
where day(dte) = 1
当然,语法可能因数据库而异。
另一个解决方案,使用 Postgres,如果您需要 select 每个月的第一行,如果不能保证那将是该月的第一天:
CREATE TABLE dates (
id BIGSERIAL PRIMARY KEY,
date TIMESTAMP NOT NULL
);
INSERT INTO dates(date)
VALUES ('2017-05-05'::timestamp), ('2017-05-02'::timestamp), ('2017-05-30'::timestamp), ('2017-05-25'::timestamp), ('2017-05-15'::timestamp), ('2017-05-01'::timestamp), ('2017-06-10'::timestamp), ('2017-06-02');
SELECT DISTINCT ON(EXTRACT(MONTH FROM date), EXTRACT(YEAR FROM date)) date
FROM dates
ORDER BY EXTRACT(MONTH FROM date), EXTRACT(YEAR FROM date), date ASC;
结果:
date
--------------------
2017-05-01T00:00:00Z
2017-06-02T00:00:00Z
另一个解决方案,使用 Sql 服务器
声明@FirstDOM 日期,@LastDOM 日期时间
set @FirstDOM = (select dateadd(d,-1,dateadd(mm,datediff(m,0,getdate()),1 )))
SELECT CONVERT( varchar, @FirstDOM,101);