获取每月第一天的时间戳
Posted
技术标签:
【中文标题】获取每月第一天的时间戳【英文标题】:Getting timestamp of first day of month 【发布时间】:2021-06-11 05:27:55 【问题描述】:DB-Fiddle
CREATE TABLE PaL (
id SERIAL PRIMARY KEY,
event_date DATE
);
INSERT INTO PaL
(event_date)
VALUES
('2020-01-01'),
('2020-02-05'),
('2020-03-20'),
('2020-04-15'),
('2020-05-11'),
('2020-06-18'),
('2020-07-19'),
('2020-12-31');
预期结果:
first_date_of_the_month first_timestamp_of_the_month
2020-01-01 2020-01-01 00:00:00
2020-02-01 2020-02-01 00:00:00
2020-03-01 2020-03-01 00:00:00
2020-04-01 2020-04-01 00:00:00
2020-05-01 2020-05-01 00:00:00
2020-06-01 2020-06-01 00:00:00
2020-07-01 2020-07-01 00:00:00
2020-12-01 2020-12-01 00:00:00
我想提取表中每个event_date
的first date
和first timestamp
。
我正在使用以下查询执行此操作:
SELECT
DATE_ADD(DATE_ADD(LAST_DAY(pl.event_date), INTERVAL 1 DAY), INTERVAL -1 MONTH) AS first_date_of_the_month,
DATE_FORMAT(DATE_ADD(DATE_ADD(LAST_DAY(pl.event_date), INTERVAL 1 DAY), INTERVAL -1 MONTH), '%Y-%m-%d %H:%i:%s') AS first_timestamp_of_the_month
FROM PaL pl
但是,HeidiSQL
以某种方式将时间戳作为值而不是 TIMESTAMP
格式插入。
我需要如何更改查询以将结果显示为TIMESTAMP
?
【问题讨论】:
如果TIMESTAMP
是指 Unix 样式的时间戳(自 1970 年以来的秒数),则需要使用 UNIX_TIMESTAMP()
,但请注意,在许多版本的 mysql 中,这是 32 位而不是 64 位,因此过期2038.如果要64bit,需要自己计算。我用这个((to_days(expiry_dt)-719528)*86400+time_to_sec(expiry_dt))
(用于字段expiry_dt
)
如果你使用日期格式,你可以用00
表示月份styart 之前的日期,如my_date >= "2021-03-00"
表示本月的所有内容 - 它与`my_date >= 基本相同"2021-03-01 00:00:00"
【参考方案1】:
必须在这里插话....我更喜欢在 MySQL 中使用内置 LAST_DAY() 函数的方式是这样的:
SELECT LAST_DAY(event_date) + INTERVAL 1 DAY - INTERVAL 1 MONTH
字符串常量2021-03-13 00:00:00
和较短的2021-03-13
在用作DATE
、DATETIME
或TIMESTAMP
值时具有完全相同的含义。几乎不需要单独的 first_timestamp_of_the_month
值。
它也适用于 Oracle。在 SQL Server 中,它是 EOMONTH()。 postgreSQL,没那么多。
【讨论】:
如果供应商可以标准化一组最小的日期算术函数,对未来的数据库程序员来说会很好,嗯?【参考方案2】:您不必转换为字符串即可完成此操作。使用基本的日期函数就足够简单了:
SELECT event_date + interval (1 - day(event_date)) day as first_date_of_the_month,
timestamp(event_date + interval (1 - day(event_date)) day) as first_timestamp_of_the_month
FROM PaL pl;
Here 是一个 dbfiddle。
【讨论】:
event_date + interval (1 - day(event_date))
event_date 中的原始时间元素吗?
@James 。 . . date
在 MySQL 中没有时间元素。【参考方案3】:
SELECT *,
DATE_FORMAT(event_date, '%Y-%m-01') AS first_date_of_the_month,
DATE_FORMAT(event_date, '%Y-%m-01 00:00:00') AS first_timestamp_of_the_month
FROM PaL
HeidiSQL
以某种方式将时间戳作为值而不是TIMESTAMP
格式插入。
这是客户端问题。
MySQL 的数据类型系统是软的,即每个值都根据当前数据类型上下文隐式转换为所需的数据类型。但您可以使用正确的最终上下文或明确的最终 CAST。
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=21a7d3fccaca1329ef8e1797d366c5a6
【讨论】:
concat(substr(date(now()),1,7),"-01 00:00:00")
@James 你使用了 3 个函数。我只使用一种功能。以上是关于获取每月第一天的时间戳的主要内容,如果未能解决你的问题,请参考以下文章
每月第一天的贝宝每月订阅计划设置并每月定期付款 - django python