格式化其各个部分的日期

时间:2016-07-05 20:01:01

标签: sql-server-2012

我会尝试尽可能具体。我有一个导出查询,现在我的日期字段就像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

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

您使用SQL-Server-2012对此进行了标记,这意味着您可以使用一些方便的功能,例如TRY_CONVERTFORMAT

使用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    |            |
+-------------+------+------+------+------------+