如何在 SQL Server 中获取上个月的昨天日期?有人可以帮我解决这个问题吗?
Posted
技术标签:
【中文标题】如何在 SQL Server 中获取上个月的昨天日期?有人可以帮我解决这个问题吗?【英文标题】:How to get Satuday's date of previous month in SQL Server? Can someone help me with this query? 【发布时间】:2021-11-14 22:55:24 【问题描述】:假设现在我们在 9 月,我想要上个月 8 月的最后一个星期六日期的输出,其中 28-08-2021 在 SQL Server 中属于上个月的最后一个星期六
【问题讨论】:
创建 - 静态首选或动态 - 日历表。这是任何方言 SQL 中的基本、常见和频繁的需求。 它应该是动态的...请不要硬编码 【参考方案1】:..fiddle..
select *, datename(weekday, pmlsat), dateadd(week, 1, pmlsat)
from
(
select _date,
--last saturday of previous month
dateadd(day, -datepart(weekday, dateadd(day, @@datefirst, eomonth(_date, -1)))%7, eomonth(_date, -1)) as pmlsat
from
(
select top(100) dateadd(month, row_number() over(order by @@spid), '20141215') as _date
from sys.all_objects
) as d
) as p
order by _date;
【讨论】:
【参考方案2】:DECLARE @date1 DATETIME
SET @date1='2021-8-31'
WHILE Day(@date1) >= 1
BEGIN
IF (SELECT Datename(weekday, @date1)) = 'Saturday'
BREAK
SET @date1=Dateadd(dd, -1, @date1)
CONTINUE
END
SELECT Datename(weekday, @date1) AS 'Datename',
(SELECT CONVERT(NVARCHAR(20), @date1, 23)) AS 'DATE'
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案3】:首先,让我们谈谈如何获得这个月初。方法有很多种,我觉得DATEFROMPARTS()
最直观(见Simplify Date Period Calculations in SQL Server):
DECLARE @FirstOfMonth date = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);
SELECT @FirstOfMonth;
-- result:
-- 2021-09-01
现在,上个月的最后一个星期六必须在本月第一天之前的 1 到 7 天之间。所以我们可以生成一个由 7 个连续数字组成的序列,然后从每月的第一天减去这些天数,如下所示:
DECLARE @FirstOfMonth date = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);
SELECT @FirstOfMonth;
;WITH n(n) AS
(
SELECT 1 UNION ALL
SELECT n + 1 FROM n WHERE n < 7
)
SELECT d = DATEADD(DAY, -n, @FirstOfMonth) FROM n;
/* result:
2021-08-31
2021-08-30
2021-08-29
2021-08-28
2021-08-27
2021-08-26
2021-08-25 */
要确定星期六是什么,您要么需要依赖DATEPART(WEEKDAY, date)
- 这又受SET DATEFIRST
的影响,或者您需要依赖DATENAME(WEEKDAY, date)
- 而后者又受SET LANGUAGE
的影响。我会倾向于语言更稳定(英语),所以:
DECLARE @FirstOfMonth date = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);
SELECT @FirstOfMonth;
;WITH n(n) AS
(
SELECT 1 UNION ALL
SELECT n + 1 FROM n WHERE n < 7
),
d(d) AS
(
SELECT DATEADD(DAY, -n, @FirstOfMonth)
FROM n
)
SELECT LastMonthLastSaturday = d
FROM d
WHERE DATENAME(WEEKDAY, d) = 'Saturday';
-- result:
-- 2021-08-28
但这是一个主观的要求 - 如果您不能依赖其中一个,请获取日历表,那么它就是这样的:
SELECT LastMonthLastSaturday = MAX(TheDate)
FROM dbo.Calendar
WHERE TheDayOfWeekName = 'Saturday'
AND TheDate < DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1);
【讨论】:
以上是关于如何在 SQL Server 中获取上个月的昨天日期?有人可以帮我解决这个问题吗?的主要内容,如果未能解决你的问题,请参考以下文章