在 SQL Server 中使用日期时间

Posted

技术标签:

【中文标题】在 SQL Server 中使用日期时间【英文标题】:Playing with Date Time in SQL Server 【发布时间】:2011-01-10 22:48:12 【问题描述】:

我正在构建一个 s-s-rS 报告。

在报告中,一周总是从星期一到星期日。 我想知道前两周的开始和结束日期。

例如,

如果当前日期 = 2011 年 1 月 1 日 -- 本周 = 2010 年 12 月 27 日至 2011 年 1 月 2 日 -- 前一周 = 2010 年 12 月 20 日至 2010 年 12 月 26 日

我尝试了以下方法,但是当当日 = 星期日时似乎失败了

DECLARE @DT DATETIME
DECLARE @Offset INT
DECLARE @CM DATETIME
DECLARE @PM DATETIME
DECLARE @PS DATETIME

--SET @DT = GETDATE()
SET @DT = '11/14/2010' -- Monday
SET @Offset = (DATEPART(WEEKDAY, @DT) - 2) * -1
SET @CM = DATEADD(DAY, @Offset, @DT)
SET @PM = DATEADD(DAY, -7, @CM)
SET @PS = DATEADD(DAY, -1, @CM)

SELECT @Offset AS Offset, @DT AS Date, @CM AS Monday, @PM AS [Previous Monday], @PS AS [Previous Sunday], DATEPART(WK, @PM) AS Week

我该如何解决?

【问题讨论】:

有点不相关:SQL Server 2008 R2 现在有一个DATE 类型,所以你不需要为时间分配空间。 【参考方案1】:

[Calendar] 表添加到您的数据库中,并预先计算您需要的所有日期。然后,您可以在字段中包含日期名称、编号、假期等,并简单地查找您需要的值。

比玩DATEADD简单多了

关于日历表的有用文章:Why should I consider using an auxiliary calendar table?

【讨论】:

+1 用于日期表...使很多事情变得更容易和更快。 +1 日期是关系数据:为简单起见,比较函数和日期日历之间的答案***.com/questions/4647461/…【参考方案2】:

不确定这是否是最优雅的解决方案,但您可以像这样使用 @offset 做一个案例陈述:

SET @offset = CASE WHEN DATEPART(weekday, @today) >= 2
                  THEN -(DATEPART(weekday, @today) - 2)
                  ELSE -(DATEPART(weekday, @today) + 5)
               END

我相信它适用于所有情况。

【讨论】:

以上是关于在 SQL Server 中使用日期时间的主要内容,如果未能解决你的问题,请参考以下文章

关于在SQL Server中使用UTC时间保存当前日期的问题

从日期时间列中提取日期 - SQL Server Compact

SQL Server日期函数应用

在 SQL Server 日期时间字段中格式化日期时间的正确方法是啥

SQL server --时间日期函数类型转换

sql server2000如何将数字转换为日期时间