将DateTime转换为INT

12

在我的SSIS包中,我需要将DateTime的值转换为对应的INTEGER值。以下是提供的示例。

有什么想法可以将它们转换吗?

DATETIME   INT
---------  ----
1/1/2009   39814
2/1/2009   39845
3/1/2009   39873
4/1/2009   39904
5/1/2009   39934
6/1/2009   39965
7/1/2009   39995
8/1/2009   40026
9/1/2009   40057
10/1/2009  40087
11/1/2009  40118
12/1/2009  40148
1/1/2010   40179
2/1/2010   40210
3/1/2010   40238
4/1/2010   40269
5/1/2010   40299
6/1/2010   40330

3
SELECT CAST(CAST('20090101' AS DATETIME) AS INT) + 2? - Martin Smith
3个回答

20

编辑:在最近的SQL Server版本中,将类型转换为浮点数/整数不再起作用。请改用以下方法:

select datediff(day, '1899-12-30T00:00:00', my_date_field)
from mytable

请注意,字符串日期应该使用明确的日期格式,以便不受您服务器区域设置的影响。


在较早版本的SQL Server中,您可以通过将DateTime强制转换为float,然后再转换为int来将其转换为整数:

select cast(cast(my_date_field as float) as int)
from mytable

请注意:你不能直接将其转换为整数,因为如果超过中午,MSSQL会将该值四舍五入!

如果你的数据有偏移量,你可以将其加上或减去到结果中。

你可以通过直接转换来进行另一方向的转换:

select cast(my_integer_date as datetime)
from mytable

3
原文已经没有任何时间组件(至少是这样显示的)。datetime以两个整数的形式存储,因此您也可以将其转换为二进制,并将前4个字节转换为整数。可以使用以下SQL查询进行转换:SELECT CAST(substring(CAST(CAST('20090101 15:00:00' AS DATETIME) AS BINARY(8)),1,4) AS INT) - Martin Smith
真的没错 - 但是小心总比后悔好! - Steve Mayne
它不工作?!对于日期格式,它会抛出错误“不允许从数据类型日期显式转换为浮点数。”而对于日期时间,它会抛出“将日期和/或时间从字符字符串转换失败”的错误。 - Muflix
你使用的 SQL Server 版本是哪个,@Muflix? - Steve Mayne

10
选择 DATEDIFF(dd, '12/30/1899', mydatefield)。

为什么我们使用12/30/1899而不是12/31/1899? - Sean Brookins
2
@SeanBrookins 很久没见了,但如果我没记错的话,这与早在80年代初的Lotus Notes中的日期错误有关,Excel复制了这种行为以便与Notes兼容,自那以后其他所有软件都复制了Excel。 - Joel Coehoorn
你亲自回复而不是其他人已经很惊人了,但在35分钟内完全没有必要道歉!我检查了一下,这确实可以与Excel兼容,所以这很有道理。奇怪! - Sean Brookins
我收到了新评论的通知 :) - Joel Coehoorn

0

或者,一旦它已经在SSIS中,您可以创建一个派生列(作为某个数据流任务的一部分),其中包含:

(DT_I8)FLOOR((DT_R8)systemDateTime)

但你需要测试以进行双重检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接