2017-03-01 166 views
1

我有一個名爲ArrivalDate的VARCHAR字段的表,格式爲yymmdd(如170202)。 我寫它轉換它爲yyyymmdd這樣一個查詢它應該成爲20170202.將YYMMDD格式的VARCHAR轉換爲YYYYMMDD並忽略無效的日期格式

但我的問題是,我需要照顧的情況下被輸入到現場不合適的數據,和我的查詢需要排除數據。我通過使用TSQL的ISDATE函數來實現這種排除。我也需要選擇最近的條目(我正在使用asc for order命令)。

我正在使用各種轉換器來編寫這個查詢,下面是我的實現與示例表和數據。

Declare @tmp TABLE (theDates VARCHAR(MAX)) 

INSERT INTO @tmp VALUES('170202') 

SELECT TOP 1 t.theDates 
WHEN (ISDATE(t.theDates) = 1) THEN CONVERT(VARCHAR(max),CONVERT(datetime t.theDates), 112) 
FROM @tmp t 
WHERE (ISDATE(t.theDates) = 1) 
ORDER BY CAST(t.theDates as DATE) 

不過,我不喜歡我的方法,它有時無法轉換和投用的值,如02年2月2日打破了查詢時出現錯誤。有人可以告訴我一個更好的書寫這種功能的方法。

非常感謝!

+0

爲什麼你會將日期存儲爲日期? –

+1

使用SQL Server 2012及更高版本,[TRY_CONVERT](https://msdn.microsoft.com/en-us/library/hh230993.aspx)可能是您正在查找的內容。 – Heinzi

+0

這只是與@ErikPhilips合作的表格。我沒有寫模式,我不會將日期存儲爲VARCHAR – Mark

回答

1

您可以使用TRY_CONVERTCONVERT來獲取正確的格式並轉換該值。然後檢查字符串是否正好是6個字符以防止其他格式被返回。

SELECT 
    convert(char(10),convert(date, theDates, 12),112) 
FROM 
    (values('02/02/02'),('170202')) x(theDates) 
WHERE 
    try_convert(date, theDates, 12) is not null 
    and len(theDates) = 6 
+0

您的解決方案效果最好。非常感謝。 謝謝大家! – Mark

1

您可以使用cast(@date as datetime)

declare @date varchar(max); 
    set @date='170202'; 
    select 
    CASE WHEN (ISDATE(cast(@date as datetime)) = 1) 
     THEN CONVERT(VARCHAR(max), CONVERT(datetime, cast(@date as datetime)), 112) end 
     from table 

    set @date='02/02/02'; 
    select 
    CASE WHEN (ISDATE(cast(@date as datetime)) = 1) 
     THEN CONVERT(VARCHAR(max), CONVERT(datetime, cast(@date as datetime)), 112) end 
     from table 
+0

謝謝您的回答。但是,如果我插入相同的值,一個與衝突格式,一個沒有(02/12/02和021202到表中並運行您的查詢結果是不同的 – Mark

+0

021202出來作爲20021202 02/12/02出來as 20020212 它看起來像mm和dd已經交換取決於是否在日期是斜線。任何想法如何解決這個問題? – Mark

+0

@Mark一些其他答案處理 –

0

請使用創建功能檢查日期格式是否有效,並以現金克勞斯內部查詢中使用這個有趣的。

ALTER FUNCTION dbo.f_CheckDate 
 
(@InDate nvarchar(25)) 
 
RETURNS DATE 
 
AS 
 
    BEGIN 
 
     declare @Return DATETIME 
 
     select @return = CASE WHEN ISDATE(@InDate) = 1 
 
          THEN @InDate 
 
          ELSE NULL 
 
          END 
 
     return @return 
 
    END

0

你可以使用TRY_CASTTRY_CONVERT如果值不能被投它會返回NULL。

SELECT 
    TRY_CAST('20170228' AS DATETIME), 
    TRY_CAST('170228' AS DATETIME), 
    TRY_CONVERT(DATETIME, '20170228'), 
    TRY_CONVERT(DATETIME, '170228') 

這適用於SQL Server 2012及更新版本。