Sql-Server

TSQL 提取時間值並重新格式化,同時排除非數字,例如 ‘Apr 2 2018 12:36PM’ to ‘1236’

  • November 23, 2021

我有一個 nvarchar 欄位,其中包含格式為“Apr 2 2018 12:36PM”的日期和時間數據,我需要將值提取為“1236”。雖然我使用了子字元串和右的組合,但我仍然需要刪除“:”和“上午或下午”,並替換小時小於 2 位的前導空格,例如 0500。此 TSQL 將作為最後一個集成現有多重案例(如下所示)中的一段邏輯,當邏輯從實際日期時間欄位中提取時間時成功使用 TSQL 案例。任何幫助將非常感激。感謝您的時間

CASE
   WHEN Format(CAST(dbo.FieldSurveyData.TimeTestin AS datetime) , 'HHmm' , 'en-au') > 0
       THEN Format(CAST(dbo.FieldSurveyData.TimeTestin AS datetime) , 'HHmm' , 'en-au')
   WHEN Format(CAST(dbo.FieldSurveyData.TimeStartP AS datetime) , 'HHmm' , 'en-au') > 0
       THEN Format(CAST(dbo.FieldSurveyData.TimeStartP AS datetime) , 'HHmm' , 'en-au')
   WHEN Format(CAST(dbo.FieldSurveyData.TimeStar_1 AS datetime) , 'HHmm' , 'en-au') > 0
       THEN Format(CAST(dbo.FieldSurveyData.TimeStar_1 AS datetime) , 'HHmm' , 'en-au')
   WHEN Format(CAST(dbo.FieldSurveyData.TimeFini_2 AS datetime) , 'HHmm' , 'en-au') > 0
       THEN Format(CAST(dbo.FieldSurveyData.TimeFini_2 AS datetime) , 'HHmm' , 'en-au')
   ELSE ''
END

假設您的值都是一致的,並且您正在尋找一個單行(因為使用變數會更簡單),您應該能夠使用以下內容:

FORMAT(CONVERT(INT, REPLACE(REPLACE(REPLACE(LTRIM(RIGHT(YourField, 7)), 'AM', ''), 'PM', ''), ':', '')), '0000')

這是相同的多行格式程式碼:

FORMAT
(
   CONVERT
   (
       INT, 
       REPLACE
       (
           REPLACE
           (
               REPLACE
               (
                   LTRIM
                   (
                       RIGHT(YourField, 7)
                   ), 
                   'AM', 
                   ''
                ), 
                'PM', 
                 ''
            ), 
            ':', 
            ''
        )
    ), 
   '0000'
)

任你選。🙂

順便說一句,SQL Server 2012 現在已經結束生命(實際上只是延長了大約 7 個月的支持)。如果您要升級到較新的版本(2017 或更高版本),您將可以訪問可用作單個函式呼叫而不是三個函式呼叫的TRANSLATE()函式REPLACE()。從理論上講,這應該更高效,但程式碼也更少冗長,使其更具可讀性和可維護性。只是一些思考的食物。

引用自:https://dba.stackexchange.com/questions/302994