获取每月第一天的时间戳

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_datefirst datefirst 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 在用作DATEDATETIMETIMESTAMP 值时具有完全相同的含义。几乎不需要单独的 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

如何填充开始日期为每月第一天的缺失值?

PHP DATE 如何取得当月的第一天和最后一天

java获取每个月最后一天的日期

如何在mysql数据库中取得每月第一天和最后一天之间的数据?

EXCEL问题,怎么用函数或公式取得当月最后一天