【问题标题】: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"

标签: mysql sql date datetime


【解决方案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 个函数。我只使用一种功能。
猜你喜欢
  • 2019-09-10
  • 2012-06-29
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
相关资源
最近更新 更多