2

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

我在表 A 中有一个列,它是一个名为 ConstructionYear 的浮点列。它填充了一个简单的 4 位数年份(即 2010、2005、1972 等)。我需要使用这些年份填充表 B 的 YearBuilt 日期时间字段。我已经搜索和搜索并尝试了我在网上找到的各种不同的 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)

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

  1. 我不知道 SQL Server 用于日期时间的 1900 纪元。由于我看到的所有 1905 年的日期时间,我可以看出正在发生一些事情,但我不知道它占用了我的 2005 年并将其计算为从 1900 年开始的日子。

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

4

4 回答 4

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变量在哪里

希望能帮助到你!

于 2012-07-12T22:57:19.337 回答
3

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

您可以使用

DATEFROMPARTS(ConstructionYear, 1, 1)

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

于 2012-07-12T22:57:55.653 回答
1

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

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

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

于 2012-07-12T22:54:01.090 回答
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. 如果要存储日期,请使用日期数据类型。

于 2012-07-12T23:05:16.823 回答