【问题标题】:Get DateTime corresponding to last Thu or Fri or Mon etc in SQL Server 2012在 SQL Server 2012 中获取与上一个周四或周五或周一等对应的日期时间
【发布时间】:2015-04-17 16:18:06
【问题描述】:

我有一个特定的 DATETIME 值,我想获取给定日期之前的给定工作日“n”(其中 n 是从 1 到 7 的整数)的 DATETIME 值。

问题:如果给定 currentDate 的值和 lastWeekDay 的值,我该怎么做?

例如,如果给定的日期是 2015 年 6 月 15 日,格式为 mm/dd/yyyy,那么 2015 年 6 月 15 日之前的 6 周工作日的日期是什么。在这个例子中,给定的日期是星期一,我们想要上星期五的日期(即工作日 =6)。

declare @currentDate datetime, @lastWeekDay int;
set @currentDate = getdate();
set @lastWeekDay = 6;--this could be any value from 1 thru to 7
select @currentDate as CurrentDate, '' as LastWeekDayDate --i need to get this date

更新 1

除了 Anon 的出色回答外,我还找到了另一种方法,如下所示。

DECLARE @currentWeekDay INT;
SET @currentWeekDay = DATEPART(WEEKDAY, @currentDate);

--Case 1: when current date week day > lastWeekDay then subtract 
--        the difference between the two weekdays
--Case 2: when current date week day <= lastWeekDay then go back 7 days from
--        current date, and then add (lastWeekDay - currentWeekDay)

SELECT
  @currentDate AS CurrentDate,
  CASE
    WHEN @currentWeekDay > @lastWeekDay THEN DATEADD(DAY, -1 * ABS(CAST(@lastWeekDay AS INT) - CAST(@currentWeekDay AS INT)), @currentDate)
    ELSE DATEADD(DAY, @lastWeekDay - DATEPART(WEEKDAY, DATEADD(DAY, -7, @currentDate)), DATEADD(DAY, -7, @currentDate))
  END AS LastWeekDayDate;

【问题讨论】:

  • 是特定年份还是任何年份?
  • 没有。给定的数据是当前数据和工作日。
  • 那么,如果给定的日期是 04/17/2015 并且 lastWeekDay =4,那么结果是 2015 年 4 月 15 日。这样正确吗?
  • 是的,没错。但我正在寻找一个通用的解决方案,而不仅仅是你提到的这个案例。
  • 我不明白你在这里想要做什么。您是否试图找出包含您传入日期的给定工作日数字的日期?换句话说,给定一个你想知道的日期时间,得到星期几?

标签: datetime sql-server-2012


【解决方案1】:

计算自固定日期以来经过了多少天,以 7 为模,然后从输入日期中减去。神奇的数字“5”是因为日期零 (1900-01-01) 是星期一。向前移动 5 天使 @lastWeekDay 范围 [1..7] 映射到工作日范围 [Sunday..Saturday]。

SELECT DATEADD(day,-DATEDIFF(day,5+@lastWeekDay,@currentDate)%7,@currentDate)

由于SET DATEFIRST,我避免使用DATEPART(weekday,[...]) 函数

【讨论】:

  • 你是个天才。非常感谢。我错过了一些边缘情况,但是您的 T-SQL 可以完美地处理它并解决所有边缘情况。
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
相关资源
最近更新 更多