2009-08-12 57 views
4

我有以下TSQL查詢來獲取不同的日期時間值:TSQL獲取DateTime值的部分字符串?

SELECT CONVERT(DATETIME, EndDtField - StartDtField, 120) AS Duration 
    FROM myTable; 

結果將是:

Duration 
    1900-01-01 23:02:04.000 
    .... 

我試圖從這樣01 23:02:04.000結果得到部分字符串使用RIGHT()功能(實際上優選在01 23:02:04而不000格式):

SELECT RIGHT(CONVERT(DATETIME, EndDtField - StartDtField, 120), 15) AS Duration 
    FROM myTable; 

結果是:

Duration 
1 1900 11:02PM 
... 

它看起來像的RIGHT(..)值是datetime值。即使我指定datetime值的格式爲yyyy-mm-dd hh:mi:ss,但仍無法獲得預期結果。如何從持續時間中獲得只有日期和時間的部分字符串(dd hh:mi:ss)?我真的不喜歡解析出dayhourminutesecond值,然後建立一個字符串。

其他選擇?

回答

4

你可能需要下面的T-SQL前:

SELECT RIGHT(CONVERT(VARCHAR, EndDtField - StartDtField, 121), 15) AS Duration FROM myTable; 
+0

這就是我想要的。有用!謝謝謝爾蓋! – 2009-08-12 15:16:12

+0

使用日期格式爲121的CONVERT時,可以使用char(23),這是所需的確切長度。沒有長度的「varchar」將是varchar(30) – 2009-08-12 15:18:16

+0

太好了。我不知道varchar默認是varchar(30)。感謝你的信息。不確定是否可以在sql server上自定義該默認值。 – 2009-08-12 16:41:16

3

有一些做的事情類似於您正在嘗試SQL函數:

DatePart會得到一個日期的特定部分。所以你可以用你的持續時間字段來設置它的格式,只要你喜歡。

DateDiff將得到兩個日期之間的差值。你可以用這個替換整個減法。

+1

這些功能是好的,但我明白,我還是要呼籲4日期部分構建部分字符串(日,小時,分鐘和秒)。 – 2009-08-12 15:09:42

1

它看起來像RIGHT(..)的值是日期時間值。

CONVERT的值是一個datetime值,因爲這是你告訴它轉化成。那麼你對RIGHT()的調用會隱式轉換爲一個字符串,在那裏sql服務器可以選擇它想要的任何轉換格式(提示—默認是這樣的:mon dd yyyy hh:miAM (or PM))。你想自己將其轉換爲varchar。

所以,回顧一下。您目前正在做這件事:

  • 減去兩個日期(這是正常的,但使用DATEDIFF()會更好)
  • 呼叫CONVERT()從該減法
  • 調用右鍵創建一個日期時間()在該日期時間值,強制SQL Server做默認轉換爲varchar

你想這樣做:

  • 轉換爲特定的字符串類型的主叫RIGHT()

  • 呼叫DateDiff()前面使用秒鐘的日期部分參數
  • 轉換返回秒爲一個好看的時間跨度在您的客戶端之前,碼。
0

嘗試轉換爲varchar()將RIGHT()

+0

沒有運氣。我試過了。 – 2009-08-12 15:13:59

1

關閉我的頭頂,做最簡單的方法,這是做兩次計算,然後連接兩個字符串。這可以在單個select語句中執行。

-- example 
select cast(day(getdate()) as varchar) + ' ' + convert(varchar, getdate(), 108) 

-- your code 
SELECT cast(day(EndDtField - StartDtField) as varchar) + ' ' + 
     convert(varchar, EndDtField - StartDtField, 108) AS Duration 
    FROM myTable; 
0

試試這個

SELECT CAST(DATEPART(DAY,(EndDtField - StartDtField)) AS VARCHAR)+' '+CAST(DATEPART(HOUR,(EndDtField - StartDtField)) AS VARCHAR)+':'+CAST(DATEPART(MINUTE,(EndDtField - StartDtField)) AS VARCHAR)+':'+CAST(DATEPART(SECOND,(EndDtField - StartDtField)) AS VARCHAR) 
    FROM myTable; 

再見

0
Convert(DateTime,Convert(char,GetDate(),101),101)