【问题标题】:How to find target data as next Wednesday at 1700 in SQL Server 2008如何在 SQL Server 2008 中查找下周三 1700 的目标数据
【发布时间】:2013-12-23 11:30:54
【问题描述】:

我们有一个包裹递送系统,将收到的包裹记录为 ParcelReceivedDate,一个日期时间字段。

我们必须以这样的方式定义目标递送日期和时间,这样在周六或周日收到的任何包裹都必须将目标递送日期设置为下周三 1700 GMT。

 CASE 
     WHEN Priority = 'Normal' and DATENAME(weekday,ParcelReceivedDate) IN ('Saturday') 
     THEN ??

     WHEN Priority = 'Normal' and DATENAME(weekday,ParcelReceivedDate) IN ('Sunday')  
     THEN ??

     Else DATEADD(hour,24,ParcelReceivedDate)
 END as ParcelTargetDate

【问题讨论】:

  • 我已经编辑了我的答案。检查语法,但主要道路已被追踪;)
  • 你有,或者你能创建一个calendar table吗?这将是解决此问题的最简单方法。

标签: sql sql-server sql-server-2008 datetime


【解决方案1】:

试试这个:

CASE 
    WHEN Priority = 'Normal' and DATENAME(weekday,ParcelReceivedDate) IN ('Saturday') 
    THEN
        dateadd(second, -datepart(second, ParcelReceivedDate), 
            dateadd(minute, -datepart(minute, ParcelReceivedDate), 
                dateadd(hour, 17 - datepart(hour, ParcelReceivedDate), 
                    dateadd(day, 4, ParcelReceivedDate)
                )
            )
        )
    WHEN Priority = 'Normal' and DATENAME(weekday,ParcelReceivedDate) IN ('Sunday')  
    THEN
        dateadd(second, -datepart(second, ParcelReceivedDate), 
            dateadd(minute, -datepart(minute, ParcelReceivedDate), 
                dateadd(hour, 17 - datepart(hour, ParcelReceivedDate), 
                    dateadd(day, 3, ParcelReceivedDate)
                )
            )
        )
    ELSE DATEADD(hour,24,ParcelReceivedDate
END as ParcelTargetDate

您知道您是在周六还是周日,因此您可以添加偏移天数以达到周三

【讨论】:

  • 问题在于时间和日期。例如,如果 ParcelRecievedDate 是 2013-12-21 12:00:00.000 那么 ParcelTargetDate 应该是 2013-12-25 17:00:00.000
  • @BIQuad:祝您有美好的一天;)因为您是新手,如果您愿意,可以点击检查接受答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多