SQL:从Timestamp字段中删除所有特殊字符并转换为INT

时间:2017-04-10 09:18:02

标签: sql sql-server

我有一个来自不同源系统的ID列。此ID有时为NULL,下游要求不是报告中的任何空值。因此,业务部门决定使用时间戳字段(创建日期)来替换ID列中的NULL。

因此当ID为NULL时,我想将我的CreatedDate转换为ID(转换为INT),因此它对于任何NULL记录都是唯一的。

示例:如果ID = NULLCreatedDate = 2015-12-09 23:12:44.947 然后ID = 09122015231244(DDMMYYYYHHMMSS)

目前,我的代码如下所示,但未产生预期结果:

Convert (nvarchar(50),(Convert(BIGINT,(DATEPART(day,CreatedOn)*1000000 
+ DATEPART(MONTH,CreatedOn)*10000 + DATEPART(Year,(CreatedOn)) )) *10000
+DATEPART(HOUR,CreatedON)*100 +DATEPART(minute,CreatedOn)
+ DATEPART(second,CreatedOn)))

非常感谢任何帮助。

8 个答案:

答案 0 :(得分:1)

尝试以下示例:

DECLARE @Date AS DateTime='2015-12-09 23:12:44.947'

SELECT CASE LEN(CAST(Day(@Date) AS VARCHAR(2))) WHEN 1 THEN '0'+CAST(Day(@Date) AS VARCHAR(2)) ELSE CAST(Day(@Date) AS VARCHAR(2)) END 
    + CASE LEN(CAST(Month(@Date) AS VARCHAR(2))) WHEN 1 THEN '0'+CAST(Day(@Date) AS VARCHAR(2)) ELSE CAST(Month(@Date) AS VARCHAR(2)) END
    + CAST(Year(@Date) AS VARCHAR(4)) 
    + CAST(DATEPART(Hour,(@Date)) AS VARCHAR(2)) 
    + CAST(DATEPART(Minute,(@Date)) AS VARCHAR(2)) 
    + CAST(DATEPART(Second,(@Date)) AS VARCHAR(2)) 

答案 1 :(得分:1)

请使用以下查询:

    DECLARE @dt DATETIME ='2015-12-09 23:12:44.947'

    SELECT REPLACE(CONVERT(VARCHAR(20), @dt, 103),'/','')+
           RIGHT('0'+CAST(DATEPART(hour, @dt) as varchar(2)),2)+
           RIGHT('0'+CAST(DATEPART(minute, @dt)as varchar(2)),2)+
           RIGHT('0'+CAST(DATEPART(Second, @dt)as varchar(2)),2)

输出

09122015231244

答案 2 :(得分:1)

这是一种方法:

DECLARE @D datetime = '2015-12-09 23:12:44.947'

SELECT  (CAST(DATEPART(DAY, @D) as bigint) * 1000000000) + 
        (CAST(DATEPART(MONTH, @D) as bigint) * 10000000) + 
        (CAST(DATEPART(YEAR, @D) as bigint) * 100000) + 
        (CAST(DATEPART(HOUR, @D) as bigint) * 1000) + 
        (CAST(DATEPART(MINUTE, @D) as bigint) * 10) + 
        CAST(DATEPART(SECOND, @D) as bigint)

结果:

    9321523164

See a live demo on rextester

答案 3 :(得分:1)

我使用SQL-Server doc搜索了一个解决方案:

我认为以下代码可以解决您的问题:

DECLARE @date DATETIME ='2015-12-09 23:12:44.947'
SELECT CONVERT(bigint, (SELECT REPLACE(CONVERT(varchar(20), @date, 105),'-','')+
RIGHT(CAST(DATEPART(hour, @date) AS VARCHAR(2)),2)+
RIGHT(CAST(DATEPART(minute, @date) AS VARCHAR(2)),2)+
RIGHT(CAST(DATEPART(Second, @date) AS VARCHAR(2)),2)))

<强>输出

12092015231244

但是我看到int类型很小,可以存储新的ID。你应该使用:

  • 使用bigint
  • 缩短你的身份。

我很抱歉我的英语,因为不是我的母语。

答案 4 :(得分:0)

尝试以下查询将DATETIME转换为INT

 DECLARE @dt DATETIME 
 SELECT @dt = '2015-12-09 23:12:44.947'
 SELECT CONVERT(INT, @dt) 

答案 5 :(得分:0)

这个会奏效。 +运算符与Int和Varchar数据类型的工作方式不同。

如果value是numeric类型,它将执行加法。如果它应用于Varchar值,那么它将只是连接。 Datepart将为您提供整数输出,Datename将为您提供varchar输出。

DECLARE @DATE DATETIME ='2015-12-09 23:12:44.947'

SELECT @DATE , DATENAME(D,@DATE)
             +CAST(DATEPART(MM,@DATE) AS VARCHAR(50))
             +DATENAME(YY,@DATE)
             +DATENAME(HH,@DATE)
             +DATENAME(MINUTE,@DATE)
             +DATENAME(SS,@DATE)

答案 6 :(得分:0)

您可以这样使用:

declare @e varchar(50)
set @e = '123.54'
select cast(replace(@e,'.','') as int)

您可以重复替换,直到所有字符都消失,然后转换为int。

答案 7 :(得分:0)

转换字符'103'给你ddmmyyyy,用空字符串替换'/'并通过用空字符串替换':'来追加时间(114),瞧,你得到你需要的东西

Declare @dt datetime = getdate(),@string varchar(max)
select @string = replace(REPLACE(CONVERT(CHAR(10), @dt, 103), '/', '')+convert(varchar(8),@dt, 114), ':','') 

输出:10042017151704

正是您需要的DDMMYYYYHHMMSS

但它不能是int,你可以把它变成bigint,

因此

 declare @a bigint = cast(@string as bigint)