我有一个来自不同源系统的ID列。此ID有时为NULL,下游要求不是报告中的任何空值。因此,业务部门决定使用时间戳字段(创建日期)来替换ID列中的NULL。
因此当ID为NULL时,我想将我的CreatedDate转换为ID(转换为INT),因此它对于任何NULL记录都是唯一的。
示例:如果ID = NULL
和CreatedDate = 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)))
非常感谢任何帮助。
答案 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
答案 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。你应该使用:
我很抱歉我的英语,因为不是我的母语。
答案 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)