【问题标题】:DimDate won't load when date range changed to start from 01-01-0001当日期范围更改为从 01-01-0001 开始时,不会加载 DimDate
【发布时间】:2018-12-14 14:42:20
【问题描述】:

我已经解决了之前的问题,谢谢。但是,我仍然对以下内容有疑问(之前的一部分)。由于 DATETIME 不支持“0001-01-01”,如何将结果转换为 DATE 数据类型?我已经尝试过 DATETIME2 但不起作用,并且 StartDate 需要为“0001-01-01”。非常感谢任何帮助。

声明@CurrentDate DATE = '0001-01-01'

选择 DATEADD(QQ, DATEDIFF(QQ, 0, @CurrentDate), 0) AS FirstDayOfQuarter, DATEADD(QQ, DATEDIFF(QQ, -1, @CurrentDate), -1) AS LastDayOfQuarter, CONVERT(VARCHAR(10), DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, (6- DATEPART(DAY, @CurrentDate)), @CurrentDate)),0),120) AS 第一个星期一


错误信息:

将日期数据类型转换为日期时间数据类型导致值超出范围。

【问题讨论】:

  • 请添加#DimDate表的架构
  • 您的 SELECT 实际运行 (sqlfiddle.com/#!18/9eecb/23758)。据推测,您的表中有一个datetime 数据类型。
  • 如果您确实需要存储未填充的日期,请改用可空类型。
  • 要回应@GordonLinoff 所说的内容,您需要将datetime-type 列切换到datetime2-type 列(或者可能更合适)。虽然我很好奇日期时间类型列在日期维度中的作用......

标签: sql sql-server sql-server-2017


【解决方案1】:

日期时间数据类型的范围是从 1753 年 1 月 1 日到 9999 年 12 月 31 日。

此处的错误表明您超出了下限或下限。

如果您必须从 0001 存储该值,请改用 Varchar。

在我见过的许多实时项目中,它通常从 1900-01-01 开始,人们将其作为默认的最小日期

【讨论】:

  • 不要将 varchar 与日期类型混合使用会带来很多维护痛苦
  • 谢谢 Sree,我知道通常使用 1900,但他们想要 0001。此外,使用 varchar 将不起作用,因为稍后我将在逻辑中使用 DATDIFF 和 DATEPART。
  • 这是不工作的逻辑,因为它返回 DATETIME 结果。任何帮助将非常感激。 DECLARE @CurrentDate DATE = '0001-01-01' SELECT DATEADD(QQ, DATEDIFF(QQ, 0, @CurrentDate), 0) AS FirstDayOfQuarter, DATEADD(QQ, DATEDIFF(QQ, -1, @CurrentDate), -1) AS LastDayOfQuarter, CONVERT(VARCHAR(10), DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, (6-DATEPART(DAY, @CurrentDate)), @CurrentDate)),0),120) 作为 FirstMondayOftheMonth跨度>
猜你喜欢
  • 1970-01-01
  • 2018-08-08
  • 2018-12-06
  • 2015-12-31
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 2011-10-07
相关资源
最近更新 更多