将float(YYYY)转换为datetime

时间:2012-07-12 22:50:06

标签: sql sql-server

我对SQL比较陌生,所以如果这是一个愚蠢的问题,请原谅我。我现在已经尝试了很长时间才能让它发挥作用。

我在表A中有一个列,它是一个名为ConstructionYear的浮点列。它有一个简单的4位数年份(即2010年,2005年,1972年等)。我需要使用这些年来填充表B的YearBuilt datetime字段。我已经搜索并搜索了我在网上找到的各种不同的convert()和cast()组合,但它没有用。

我想要发生的是:

  

'2008' - > '2008-01-01 00:00:00.000'

     

'2005' - > '2005-01-01 00:00:00.000'

     

'1986' - > '1986-01-01 00:00:00.000'

而不是当前正在发生的事情(使用CAST(ConstructionYear AS DATETIME)):

  

'2008' - > '1905-07-02 00:00:00.000'

     

'2010' - > '1905-07-04 00:00:00.000'

     

'1984' - > '1905-06-08 00:00:00.000'

编辑:解决方案:cast(convert(varchar,@ConstructionYear) AS DATETIME)

所以我的问题有2个主要原因(除了我是sql的新手)。

  1. 我不知道SQL Server用于日期时间的1900年纪元。我可以说有些事情正在发生,因为我所看到的所有1905年的日期时间,但我不知道它是从我的2005年开始计算它是从1900年开始的几天。

  2. 1753年。为什么1753年是我们可以使用的最早年份?在我在这里发布我的问题之前,我可能在某些时候使用了正确的语法,但它没有运行,因为我的数据在1753年之前有几年。我认为错误是我的代码。

4 个答案:

答案 0 :(得分:4)

检查此示例:

DECLARE @ConstructionYearas FLOAT
SET @ConstructionYear = 2012
SELECT FloatToDatetime = CAST(convert(varchar(4),@ConstructionYear) as datetime)

将输出:

2012-01-01 00:00:00.000


基本上使用:

CAST(convert(varchar(4),@ConstructionYear) as datetime)

其中@ConstructionYear是您的Float变量

希望它有所帮助!

答案 1 :(得分:3)

除了@Ghost's回答,如果您使用的是SQL SERVER 2012

您可以使用

DATEFROMPARTS(ConstructionYear, 1, 1)

参考:http://msdn.microsoft.com/en-us/library/hh213228.aspx

答案 2 :(得分:1)

这应该可行,但可能有更好的方法

CAST(CAST(ConstructionYear  as nvarchar(4)) + '-01-01' as datetime)

您的查询正在做的是花费您提供的天数并将其添加到1900年1月1日的SQL服务器时代,这给出了您看到的结果

答案 3 :(得分:1)

DECLARE @y FLOAT;
SELECT @y = 2012;
SELECT DATEADD(YEAR, @y-1900, 0);

为什么您认为2012年的数值直接转化为若干年?实际上在SQL Server中,数值会转换为自1900-01-01以来的天数。因此,以下结果应该会产生相同的结果:

SELECT CONVERT(DATETIME, 2012);
SELECT DATEADD(DAY, 2012, '19000101');

正如其他人所建议的那样,我强烈建议您正确存储这些数据。虽然您可以使用像SMALLINT更安全的东西,但为什么不使用DATE?它具有内置验证功能,能够直接使用各种日期/时间功能而无需转换,并且没有使用FLOAT等近似数据类型可能遇到的任何固有的舍入问题。如果您要存储日期,请使用日期数据类型。