【问题标题】:Wrong (future) convert to datetime错误(未来)转换为日期时间
【发布时间】:2014-08-10 06:55:00
【问题描述】:

这些数值需要转换成日期时间。这是出生日期,因此这些值不能是将来的值。我可以以某种方式实施不接受出生日期的规则,其值等于 100 岁以上吗??

201246-1324 040210-6387 111257-0647 040210-6387

结果:

2046-12-20 00:00:00.000 - 错误 2010-02-04 00:00:00.000 - 对 1957-12-11 00:00:00.000 - 右 2010-02-04 00:00:00.000 - 对

【问题讨论】:

  • 你怎么知道第一个是2046,而不是1946?
  • 第一个是 NOT 2046 - 它是 1946。因此我写错了。我知道是因为你不能知道未来的出生日期。
  • 对不起,我应该问“为什么您的查询返回 2046?”;你能显示你正在使用的查询吗?这显然是一个两位数的年份截止问题。
  • 选择转换 (datetime, Stuff(Stuff((substring([Cpr nr],1,6)),5,0,'.'),3,0,'.'), 4 ) 作为 CprasDate FROM [samletlifeline2]

标签: sql date datetime type-conversion


【解决方案1】:

暂时更改您的截止日期,因为您使用的 DOB 总是在过去..

sp_configure 'two digit year cutoff', 2015
reconfigure

然后在

【讨论】:

    【解决方案2】:

    我相信在这种情况下,您可以在 if 语句中使用 datediff 函数 本质上,如果要比较的两个日期之间的时间大于 100 年,则不要插入记录 http://www.w3schools.com/sql/func_datediff.asp

    【讨论】:

    • 是的,我需要 Datediff 我需要组合 select convert (datetime, Stuff(Stuff((substring([Cpr nr],1,6)),5,0,'.'),3 ,0,'.'), 4) as CprasDate FROM [samletlifeline2]
    • with DECLARE @dob datetime SET @dob='1987-06-19 00:00:00' SELECT DATEDIFF(hour,@dob,GETDATE())/8766 AS AgeYearsIntTrunc
    • if (datediff(year,getdate(), @dob)
    【解决方案3】:

    首先,可以通过将当前世纪添加到值并检查当前年份来防止使用 2 位数年份的未来日期。如果更大,则减去一个世纪,否则直接取值。所以...

    [YearCol] + round(year(getdate()),-2) -
      CASE
        WHEN [YearCol] + round(year(getdate()),-2) > year(getdate()) THEN 100
        ELSE 0
      END
    

    附带说明,您可以游说数据源以提供 4 位数的年份格式。

    至于防止百人队的插入?祝你好运。使用您的传入数据,您绝对无法确定出生日期是否不在当代。无论您做什么,传入流中的数据都不足以进行该调用。如果您可以控制采样的源编号,请更改格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 2014-06-18
      • 2011-02-26
      • 2018-12-23
      相关资源
      最近更新 更多