SQL 日期函数如何获取当年第一天?

嘿,我告诉你,我第一次这样做的时候,真的遇到了麻烦。
不同的数据库确实不一样。

以MySQL为例。
我在2 01 4 年开始了一个电子商务项目,服务器是MySQL5 .6 当时我想得到大年初一,所以尝试了很多方法。
第一种方法是使用 DATE_FORMAT(NOW(), '%Y-01 -01 ')。
这非常直观,但似乎有点令人困惑。
当时数据库性能还好,没有感觉变慢。
其次,STR_TO_DATE(CONCAT(YEAR(NOW()), '-01 -01 '), '%Y-%m-%d'),我有点担心这个串联转换的效率,但是当时的数据量不大,所以没有太担心。
第三个,MAKEDATE(YEAR(NOW()), 1 ),我很喜欢这个,它很简单,但需要MySQL 5 .7 或更高版本。
当时我的服务器版本低,无法使用,只好放弃。

我们来谈谈 SQL Server。
我在2 01 5 年接手了一个旧系统,数据库是SQL Server 2 01 2 ,当时用DATEFROMPARTS(YEAR(GETDATE()), 1 , 1 )很方便。
可以直接分别处理年、月、日,非常简单明了。
还有 CAST(CONVERT(VARCHAR, YEAR(GETDATE())) + '-01 -01 ' AS DATE)。
对于这种join转换,我一直觉得不如直接使用函数可靠。

对于 PostgreSQL,我在 2 01 8 年做一个金融项目,使用的是 PostgreSQL 1 0当时使用 DATE_TRUNC('year', CURRENT_DATE) 将日期缩短为年很方便。
但必须注意,它返回的是时间戳类型,必须显式转换为DATE。
还有 MAKE_DATE(EXTRACT(YEAR FROM CURRENT_DATE)::INT, 1 , 1 )。
这个组合日期也很直观。

我还看了Oracle,2 0年的政府项目,Oracle 1 2 c。
使用 TRUNC(SYSDATE, 'YEAR') 将日期截断为一年的第一天。
这个功能使用起来非常方便。
还有 TO_DATE(EXTRACT(YEAR FROM SYSDATE)||'-01 -01 ', 'YYYY-MM-DD') ,可以连接和转换,但感觉有很多字符串操作。

一般来说,要提取当前年份,可以使用 YEAR()、EXTRACT(YEAR FROM ...) 和 GETDATE() 等函数。
要创建日期 1 月 1 日,请直接连接字符串并转换日期,或使用特定于数据库的函数,例如 DATEFROMPARTS、MAKE_DATE。
截断日期、DATE_TRUNC、TRUNC 也非常有用。

但是我可以告诉你,功能兼容性确实是一个令人头疼的问题。
不同数据库的函数名称和参数不同,容易造成混淆。
您还必须注意数据类型。
例如,PostgreSQL 的 DATE_TRUNC 返回时间戳,必须显式转换为 DATE。
为了优化性能,我首先建议使用内置函数,例如 DATEFROMPARTS,它比字符串连接更好。

看看你所使用的数据库,根据实际情况选择合适的方法。
别像我一样,尝试了很久,然后头疼得厉害。

sql中怎么提取年份月份 提取年份月份的简单方法分享