2017-06-29 120 views
0

我使用Sybase IQ和具有下列存儲爲VARCHAR:SQL的Varchar轉換爲日期 - 的Sybase

01October 2010 

我想這個從varchar下面的格式轉換爲date數據類型:

yyyy-mm-dd eg.2010-10-01 

我該如何編寫這條SQL語句?提前致謝。

+0

日期沒有格式,所以第二點是無關緊要的。 – Siyual

+0

你的月份格式(mmm)和樣本數據(10)不匹配; 'mmm'是本月的3個字母的縮寫(例如,10月),而您顯示您需要2位數字(10);這是你想要的嗎?無論如何,請參閱IQ參考手冊中的轉換()函數以獲取詳細信息 – markp

+0

我已更新原始問題。我已閱讀文檔,但掙扎...任何想法?我試過這個: SELECT CONVERT(VARCHAR,visit_date,106)FROM tablename 但得到這個錯誤:數據類型轉換是不可能的。 CONVERT參數與所需的數據類型不匹配。 –

回答

0

有困難。有一個原因,你不應該把日期和時間存儲爲字符串。

自從我使用Sybase以來已經有一段時間了,但我們需要做的是將字段轉換爲YYYY-MM-DD格式,然後將其傳遞給DATE()或DATETIME()函數。

讓我們假設前兩個字符總是一個月的一天,最後4個字符是年份。這意味着兩者之間的一切都是一個月。我們還假設沒有前導或尾隨空格。如果這些假設中的任何一個失敗,那麼查詢將失敗。

然後,你可以做這樣的事情:

SELECT DATE (
     RIGHT(UnnamedField,4) + '-' + 
     CASE LTRIM(RTRIM(SUBSTRING(Unnamed,3,LEN(Unnamed) - 6))) 
      WHEN 'January' THEN '01' 
      WHEN 'February' THEN '02' 
      WHEN 'March' THEN '03' 
      . 
      . 
      . 
      WHEN 'December' THEN '12' 
     END + '-' + LEFT(UnnamedField,2) 
    ) 
FROM UnnamedTable 

需要注意的是,正如其他人所提到的,日期數據類型不是格式化的數據類型。如果可能,你應該在你的應用程序中格式化它如果您必須在查詢中執行此操作,請使用CONVERT()函數。

+0

感謝分享 - 我試過了,得到了空值......任何想法爲什麼? –

+0

我已經更新,刪除所有空格:01October2010 –

+0

@NickEdwards嘗試分開表達式,看看你得到了什麼。做'SELECT RIGHT(UnnamedField,4)AS Year,LEFT(UnnamedField,2)AS Day,....'看看每個字段在做什麼。您可能會獲取NULL,因爲一個或多個值是空值。 –

0

Sybase能夠將字符串轉換爲日期。因此,如果您使用substring將日期提取爲IQ可以轉換的格式,那麼您可以使用convert()函數。

下面是如何做到這一點的例子:

的樣本數據:

select 
    convert 
    (
     date, 
     (
      substring(col1, 3, charindex(' ', col1) - 2) -- Month 
      + substring(col1, 1, 2) -- Day 
      + substring(col1, charindex(' ', col1), 5) -- Year (include the leading space) 
     ) 
    ) 
from #tmp1 

現在,該值在:

create table #tmp1 (col1 varchar(100)) 
insert #tmp1 values ('01October 2010') 

查詢到的值的日期轉換日期格式,可以使用convert函數將日期數據類型轉換爲字符串,並使用指定的格式。日期數據類型的默認輸出已經是yyyy-mm-dd。


編輯:考慮看看@BaconBits'的答案後,我意識到,我可以使用子功能包裝leftright,和date轉換包裝簡化查詢了一下。這是一樣的邏輯;但使用簡化的包裝可能會使其更易於理解。

select 
    date 
     (
      substring(col1, 3, charindex(' ', col1) - 2) -- Month 
      + left(col1, 2) -- Day 
      + ' ' + right(col1, 4) -- Year (include the leading space) 
     ) 
from #tmp1 
+0

謝謝 - 我只是複製和粘貼上面,它不會返回任何東西...任何想法我要去哪裏錯了? –

+0

@NickEdwards它沒有提供任何錯誤或任何內容?它只是返回一個空白值的列?當我測試它時,它工作正常。您是使用我創建的測試表,還是修改它以與您的表一起使用?如果你正在使用我的測試表,你可以從#tmp1中選擇*來確保插入了一條記錄嗎? – RToyo

相關問題