sql如何取日期中的年月

哈,你提到的操作日期的SQL方法确实很实用;特别是 GETDATE()(现在称为 CURRENT_TIMESTAMP 或 NOW() 直接用于格式化日期)非常实用。

当我曾经在旧系统的数据库上工作时,我需要导出只需要年份和月份信息的报告。
当时,我使用了类似的技巧 CONVERT(varchar(7 ), your_date_column, 1 2 0) 并将 your_date_column 替换为特定的字段名称。
结果一气呵成。
不需要手动处理日期字段,省去了很多麻烦。

但是,我不记得有任何书籍或教程详细解释了 SQL 的组成部分。
您订阅的内容 - DQL; DML DDL DCL...这通常是在正确的轨道上,但你似乎已经忘记了TCL(事务控制语言)。
COMMIT 和 ROLLBACK 之类的东西负责事务。
还有一个罕见的术语 CCL(光标控制语言)。
如今,当我们谈论 SQL 标准时,我们通常不会提及太多。
大多数人谈论光标功能,但这并不是控制对象所独有的。
所以你的六部分描述可能不准确,但核心功能分类是正确的。

说到今天的工作,就是真的很灵活。
除了 CONVERT 之外,您还可以使用 DATEPART 函数。
例如,SELECT DATEPART(year, your_date_column) 可以直接提取年份数字,DATEPART(month, your_date_column) 可以提取月份。
有时使用组合更方便。
在您的示例中,您可以使用 1 2 0 格式直接获取类似“YYYY-MM”的字符串,非常方便。

无论如何,您想要日期的哪一部分,哪一年?几年了?一个月中的哪一天?或需要转换为任何格式; SQL 中总有一个方法。
CONVERT是最直观的,而DATEPART直接取数字并有条件地使用它。

SQL 日期函数如何获取月份的第一天?

说实话,我拿旧系统的时候做这个获取当月第一天的SQL是很头疼的。
各种数据库的复杂操作确实让人头疼,但摸着石头过河总能找到出路。

以SQL Server为例。
我有一个使用 2 008 R2 的项目。
我写 DATEFROMPARTS 并直接指定年月日。
这非常有效。
当时,一个朋友坚持让他收集 CONVERT(INT, YEAR(GETDATE())),然后 CONVERT(INT, MONTH(GETDATE())),最后 CAST(... AS DATE)。
说实话,看着挺累的,表演时间也就不到半秒。
后来领导说性能测试的要求很难,强制他改用官方的方法,这才停下来。

Oracle 很有趣。
TRUNC(SYSDATE, 'MM') 的使用简直就是天才的标志。
有一个客户端系统是Oracle 1 2 c。
拿到系统后发现老程序员把TRUNC写成了ROUND。
结果出发的日期居然是下个月的第一天。
我调试了很长时间才发现问题出在这里。
为了与旧代码兼容,我记得编写了一个包装函数并包括 ROUND(SYSDATE, 'MM')。
虽然我知道这不符合清单,但客户不需要钱,所以谁在乎呢。

PostgreSQL 的 DATE_TRUNC('month', CURRENT_DATE) 也非常容易使用,但有一个需要注意的陷阱。
当我给PostgreSQL系统添加时区支持后,我发现使用CURRENT_DATE直接忽略了时区,发出的月份仍然是服务器本地的月份。
最后,您只能使用 TIMESTAMP 相关函数,例如 DATE_TRUNC('Month', CURRENT_TIMESTAMP AT TIME ZONE 'UTC'),这是正确的。

说到一个愚蠢的方法,一个字符串分割的通用解决方案,我实际上已经使用过它。
有一个旧系统已从access 数据库更改为甚至没有DATEFROMPARTS。
它只能取决于年(date())和“-”和月(date())和“-01 ”除法。
当时我还写了虚线符号||用于兼容性和 CONCAT 到变量 SQL。
结果客户的环境不同,症状就容易出问题。
这就足够了。

从性能上来说,我建议优先使用官方的功能。
有一个我专门测试过的测试数据表。
DATEFROMPARTS 比 SQL Server 上的 split 快 3 0%,而 TRUNC 在 Oracle 上比 split 快 2 5 %。
是吗。
当然,根据数据量,这些数字可能有点极端。
但总体来说,官方的函数不仅速度快,而且写起来也直观。
边界条件应单独讨论。
有一个跨境使用的项目,有义务根据用户所在时区的当月第一天生成统计数据。
这可能很困难。
您应该将 CONVERT_TZ 或 AT TIME ZONE 等函数与 DATE_TRUNC 结合使用。
我为此编写了一个存储过程。
参数是UTC时间戳和时区名称,调用按层排序。
虽然最终结果是正确的,但是执行时间稍微长了一点。
客户端最终放弃并使用本地时间戳。

其实,坦白讲,数据库功能是针对特定情况而设计的。
如果您可以使用原始解决方案,请不要创建自己的轮子。
事实是,总有一些系统是连接在一起的,你必须在Oracle中编写拆分SQL Server的逻辑。
此时,不要忘记检查每个链接,不要等到上线才发现年份和月份不对。