MySQL中如何获得指定日期中月份的第一天是周几?

我记得有一次,我朋友小王要参加一个公司举办的户外拓展活动,他们要求大家早上六点到达集合地点。
小王想提前了解一下当天是星期几,于是他拿出了手机,打开了日历应用。

小王想,如果直接在日历上查找当天的星期,步骤太繁琐了。
突然,他想起自己之前学过的一些函数,比如date_add和dayname。
他想,如果能够将这两个函数组合起来,不就能轻松得到当天的星期了吗?
于是,小王打开编程软件,开始编写代码。
他先写了一个date_add函数,用来计算出当前日期所在月份的第一天。
然后,他又写了一个dayname函数,用来返回星期的名字。

代码如下: sql SET @date = '2 02 3 -04 -01 '; -
假设当前日期为2 02 3 年4 月1 日
SELECT date_add(@date, interval -day(@date) + 1 day), dayname(date_add(@date, interval -day(@date) + 1 day));
执行这段代码后,小王发现他的手机屏幕上显示出了“Saturday”。
原来,那天确实是星期六。
这样一来,他就能轻松地知道当天是星期几了。

等等,我还突然想到一个问题。
如果小王想查看未来一个月内每天的星期,该怎么办呢?

SQL 日期函数如何获取星期几?

说白了,获取SQL中的日期对应的星期几,不同数据库的操作方式差异很大。
其实很简单,先说最重要的,每个数据库都有特定的函数来实现这一需求。
比如在MySQL里,你可以使用DAYNAME、WEEKDAY或者DAYOFWEEK。
去年我们跑的那个项目,我们用的是DAYOFWEEK,大概3 000量级的数据量,返回的是一个数字,1 代表周日,7 代表周六。
我一开始也以为WEEKDAY和DAYOFWEEK是一回事,后来发现不对,WEEKDAY是0到6 ,周一到周日,而DAYOFWEEK是1 到7 另外一点,MySQL的WEEKDAY和DAYOFWEEK的星期起始日是不同的,这可能会在特定情况下造成误解。

对于SQL Server,你可能会用到DATENAME和DATEPART。
DATENAME返回星期的英文全称,而DATEPART返回的是一个数字,1 代表周日,7 代表周六。
去年那个项目中,我们也遇到过时区的问题,所以在使用之前一定要测试验证。
等等,还有个事,SQL Server、PostgreSQL和Oracle通常以周日为1 ,周六为7 ,这和MySQL是相反的。

在PostgreSQL里,TO_CHAR函数很强大,你可以通过不同的格式返回星期全称或缩写。
记得返回的字符串可能包含空格,所以需要用TRIM处理一下。
我觉得这个点很多人没注意,尤其是在进行格式化输出时。

Oracle也有类似的TO_CHAR函数,可以返回星期的全称或缩写,但是它返回的字符串是大写的,所以可能需要额外处理。

总的来说,获取日期对应的星期几这件事复杂在数据库之间的差异很大,但是如果你明确需求,测试验证,并参考官方文档,就能轻松应对。
最后提醒一个容易踩的坑,那就是不同数据库的星期起始日可能不同,这一点在设计和编写查询时特别要注意。