我对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的新手)。
我不知道SQL Server用于日期时间的1900年纪元。我可以说有些事情正在发生,因为我所看到的所有1905年的日期时间,但我不知道它是从我的2005年开始计算它是从1900年开始的几天。
1753年。为什么1753年是我们可以使用的最早年份?在我在这里发布我的问题之前,我可能在某些时候使用了正确的语法,但它没有运行,因为我的数据在1753年之前有几年。我认为错误是我的代码。
答案 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)
答案 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
等近似数据类型可能遇到的任何固有的舍入问题。如果您要存储日期,请使用日期数据类型。