【问题标题】:How to figure out weekly start date如何计算每周的开始日期
【发布时间】:2012-08-16 13:02:26
【问题描述】:

我有一个存储函数,它应该计算出我的工资单周开始日期。哪个是“星期四” 但是我的存储过程总是将我的开始日期设为“星期五” 我的声明和设置函数有什么问题?我希望我的 StartWeekDay 为“Thursday”...“lStartday”在帐户表中设置为“5”我的代码如下:

DECLARE @StartWeekDay int 
SET @StartWeekDay = (Select lStartDay From Account Where lLocationID = 1)

DECLARE @CurrentDate DateTime 
SET @CurrentDate = GetDate()
DECLARE @CurrentWeekDay int
SET @CurrentWeekDay = DATEPART(dw,@CurrentDate)

DECLARE @Diff int
SET @Diff = @StartWeekDay - @CurrentWeekDay

SET @Diff = Case When @Diff > 0 Then -6 When @Diff = 0 Then 0 Else @Diff End

--
 DECLARE @DaysToStart int
 SET @DaysToStart = (DatePart(dw,@CurrentDate) - @StartWeekDay)
 IF @DaysToStart <= .1 
  BEGIN
    SET @DaysToStart = @DaysToStart + 7 
  END

 DECLARE @myStartWeekDate DateTime
 --SET @myStartWeekDate = dbo.DateOnly(DATEADD(d,@Diff,@CurrentDate))
 SET @myStartWeekDate =  Convert(nvarchar,DateAdd(d,-@DaysToStart,@CurrentDate),101) -- getting DATE only
--

【问题讨论】:

  • 你是怎么得到像When @Diff = 0 Then 0 Else @Diff这样的宝石的?

标签: sql sql-server datetime stored-procedures


【解决方案1】:

以下查询是将日期四舍五入到一周开始的标准方法。但是,这被视为星期一...

DATEADD(WEEK, DATEDIFF(WEEK, 0, @YourDate), 0)

如果您将值偏移 3,这会将函数更改为向下舍入到上一个星期四...

DATEADD(WEEK, DATEDIFF(WEEK, 0, @YourDate-3), 3)

编辑:这应该是 3,而不是 4...

SET @yourDate    = getDate()
SET @firstDay    = 3
SET @RoundedDate = DATEADD(WEEK, DATEDIFF(WEEK, 0, @YourDate-@firstDay), @firstDay)

 Value of @firstDay | Day of week this will round to
--------------------+--------------------------------
        0           |        Monday
        1           |        Tuesday
        2           |        Wednesday
        3           |        Thursday
        4           |        Friday
        5           |        Saturday
        6           |        Sunday

【讨论】:

  • 你建议这个去哪里?
  • @Shmewnix - 它几乎可以取代你所有的逻辑。
【解决方案2】:

lStartDay = 5 总是会给你星期五。星期四你需要加 4

DECLARE @DaysToStart int
 SET @DaysToStart = (DatePart(dw,@CurrentDate) - @StartWeekDay)
 IF @DaysToStart <= .1 
  BEGIN
    SET @DaysToStart = @DaysToStart + 7 
  END

如果您声明 @DaysToStart 并且 DatePart 也返回 INT,为什么要与 .1 进行比较??

【讨论】:

  • 一周不会总是以“星期日”开头吗?那么...星期四应该是 5 点吧?
  • 那部分没关系...我试过评论它,但它仍然没有做任何事情...基本上我只是想弄清楚当前相隔多少天日期从开始周开始。
  • 查看我的新帖子,我执行了几天,它总是给我每周的星期四,可能会有所帮助!
  • 这实际上是答案。在 SQL 中,日期是 0-6 而不是 1-7。所以发生的事情是一周的开始总是星期五,因为 5 是星期五。您最初的答案是 100% 准确的。
【解决方案3】:
        DECLARE @StartWeekDay int 
    SET @StartWeekDay = 5

    DECLARE @CurrentDate DateTime 
    SET @CurrentDate = '8/24/2012'
    DECLARE @CurrentWeekDay int
    SET @CurrentWeekDay = DATEPART(dw,@CurrentDate)
    SELECT @CurrentWeekDay;

    DECLARE @Diff int
    SET @Diff = @StartWeekDay - @CurrentWeekDay

    SET @Diff = Case When @Diff > 0 Then -6 When @Diff = 0 Then 0 Else @Diff End

    --
     DECLARE @DaysToStart int
     SET @DaysToStart = (DatePart(dw,@CurrentDate) - @StartWeekDay)
--change here to <1 and not <=1 that will add 8 and return friday at the end
     IF @DaysToStart < 1 
      BEGIN
        SET @DaysToStart = @DaysToStart + 7 
      END
      SELECT @DaysToStart;
     DECLARE @myStartWeekDate DateTime
     --SET @myStartWeekDate = dbo.DateOnly(DATEADD(d,@Diff,@CurrentDate))
     SET @myStartWeekDate =  Convert(nvarchar,DateAdd(d,-@DaysToStart,@CurrentDate),101) 
     SELECT @myStartWeekDate

【讨论】:

  • 这会将@currentdate 设置为定义的日期。这个存储过程获取@currentdate作为报告运行的日期...(参数通过程序传递)
  • 这只是测试,你可以把它改成GETDATE()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
相关资源
最近更新 更多