我会尝试尽可能具体。我有一个导出查询,现在我的日期字段就像YYYY-MM-DD
一样,即使它们是空白日期 -
IsNull(RIGHT(Surg_Disch_Dt_Year,4)+'-'+SUBSTRING(Surg_Disch_Dt_Month,4,2)+'-'+LEFT(Surg_Disch_Dt_Day,2),'')+@Delimit+
这会让我更接近我的结果
这是一个例子
2008--15
我不完全确定为什么子串部分不起作用。如果我将子字符串更改为
之类的其他内容IsNull(SUBSTRING(Surg_Disch_Dt_Year,1,4)+'-'+RIGHT(Surg_Disch_Dt_Month,2)+'-'+LEFT(Surg_Disch_Dt_Day,2),'')+@Delimit+
它完全将格式更改为mm / dd / yyyy
我在这里做错了什么?
答案 0 :(得分:0)
您使用SQL-Server-2012对此进行了标记,这意味着您可以使用一些方便的功能,例如TRY_CONVERT
和FORMAT
使用REPLACE(STR(SomeValue,X),' ','0'
的技巧将导致零填充数字,长度为" X"。超过这个数字的数字将导致" ****"。这部分是连接在一起的。结果是8位数字串。如果有一个NULL
,则整个字符串将为NULL
。
在任何情况下都有字符串类型的结果,您可以传递给TRY_CONVERT
。这会尝试转换为DATE
。如果它有效,那么它是一个有效的日期,如果没有,它会返回NULL
。对于转换失败的所有情况,最终ISNULL
将返回空白而不是NULL
...
DECLARE @tbl TABLE(Comment VARCHAR(100),Rad_Start_Date_Year INT,Rad_Start_Date_Month INT,Rad_Start_Date_Day INT);
INSERT INTO @tbl VALUES
('valid date',2016,7,5)
,('one missing',2016,NULL,5)
,('all missing',NULL,NULL,NULL)
,('invalid',2016,13,5);
SELECT ISNULL(FORMAT(TRY_CONVERT(DATE,REPLACE(STR(Rad_Start_Date_Year,4),' ','0')+REPLACE(STR(Rad_Start_Date_Month,2),' ','0')+REPLACE(STR(Rad_Start_Date_Day,2),' ','0')),'yyyy-MM-dd'),'')
FROM @tbl AS tbl
CREATE FUNCTION dbo.MyDATEFROMPARTS(@y NVARCHAR(4),@m nvarchar(2),@d nvarchar(2))
RETURNS NVARCHAR(10)
BEGIN
RETURN ISNULL(FORMAT(TRY_CONVERT(DATE,REPLACE(STR(@y,4),' ','0')+REPLACE(STR(@m,2),' ','0')+REPLACE(STR(@d,2),' ','0')),'yyyy-MM-dd'),'')
END
GO
DECLARE @tbl TABLE(Comment VARCHAR(100),Rad_Start_Date_Year INT,Rad_Start_Date_Month INT,Rad_Start_Date_Day INT);
INSERT INTO @tbl VALUES
('valid date',2016,7,5)
,('one missing',2016,NULL,5)
,('all missing',NULL,NULL,NULL)
,('invalid',2016,13,5);
SELECT tbl.Comment
,tbl.Rad_Start_Date_Year AS y
,tbl.Rad_Start_Date_Month AS m
,tbl.Rad_Start_Date_Day AS d
,dbo.MyDATEFROMPARTS(tbl.Rad_Start_Date_Year,tbl.Rad_Start_Date_Month,tbl.Rad_Start_Date_Day) AS SureDate
FROM @tbl AS tbl
结果:
+-------------+------+------+------+------------+
| valid date | 2016 | 7 | 5 | 2016-07-05 |
+-------------+------+------+------+------------+
| one missing | 2016 | NULL | 5 | |
+-------------+------+------+------+------------+
| all missing | NULL | NULL | NULL | |
+-------------+------+------+------+------------+
| invalid | 2016 | 13 | 5 | |
+-------------+------+------+------+------------+