2016-01-13 117 views
2

我已經搜索了一下,看不出任何問題,問這個回答我的問題,所以在這裏不言而喻。SQL - 日期不是格式指定

我試圖從數據庫獲取日期(源是日期時間格式,即「2015年11月30日00:00:00.000」),並選擇它作爲日期,但在另一種格式。在「googleing」之後,我正在使用Convert函數。首先,我設定的目標格式爲varchar:

Select 
convert(varchar(10),ac_payout_book_dt,104) as 'Dato' 

結果是迄今在正確的格式,即「2015年11月30日」

然後我需要對它進行排序的自動化腳本時,這樣一來就能用

ORDER BY Dato DESC 

...我改變了我的查詢......

Select  
convert(date,ac_payout_book_dt,104) as 'Dato' 

現在的結果是錯誤的格式,即「二零一五年十一月三十零日」

幾個回合在互聯網上之後,我也試過這個沒有任何的運氣

CAST(convert(date,ac_payout_book_dt,104) AS DATE) as 'Dato' 

任何人都可以幫助我找出我在哪裏走錯了路?

BR 安德烈亞斯

+2

哪個RDBMS是這樣的?請添加一個標籤來指定您是使用'mysql','postgresql','sql-server','oracle'還是'db2' - 或者其他的東西。 –

+0

對不起,現在將SQL Server添加到標籤。跑步2014. – Andreasp

回答

3

好吧,如果你使用

Select 
    convert(varchar(10),ac_payout_book_dt,104) as 'Dato' 

,那麼你將您DateTime(其內部在SQL Server沒有格式 - 這是一個8字節的二進制值)爲一個字符串 - 您可以控制日期如何格式化爲字符串。

爲了您的輸出進行排序,你需要一個日期(不包括時間,我相信) - 沒有問題,但是當你做

Select  
    convert(date, ac_payout_book_dt, 104) as 'Dato' 

你將你的DateTimeDate(在SQL服務器再次無格式 - 它只是一個3字節bianry值) - 這樣的風格的「104」是無用的在這裏 - 你是一個二進制值轉換爲另一種二進制值 - 和日期將顯示在默認的SQL Server日期格式。

因爲這真的是一個二進制到二進制轉換,而不字符串格式化參與,我更喜歡使用

SELECT CAST(ac_payout_book_dt AS DATE) AS 'Dato' 

因爲有真正的供應不能無論如何使用的風格是沒有意義的。

所以真的,你需要知道什麼是這樣的:

  • 您使用的一個DATEDATETIME排序或日期計算?在這種情況下,您必須使用的原始數據類型 - 不這樣做的日期的字符串表示日期的功能!

  • 你想輸出你的DATEDATETIME到屏幕?然後,你需要使用CONVERTFORMAT並提供適當的風格將其轉換爲一個 /日期格式字符串

所以,總體來說,不知道你的整個查詢 - 你可能想要做這樣的事情:

SELECT 
    CONVERT(VARCHAR(10), ac_payout_book_dt, 104) as 'Dato', 
    ..... (other columns) ..... 
FROM 
    dbo.YourTable 
WHERE 
    .... (some condition) .... 
ORDER BY 
    CAST(ac_payout_book_dt AS DATE) DESC 

或者,也許你想看看FORMAT它可從SQL Server 2012 ,允許更靈活地格式化你的日期:

SELECT 
    FORMAT(ac_payout_book_at, 'dd.MM.yyyy', 'de-de') 
+2

謝謝,marc_s。真正有用的反饋。我似乎忽略了日期和日期時間的基本事實。對不起。你的回答給了我很多幫助。 – Andreasp

+3

@Andreasp:很高興我能夠幫助!我們生活和學習 - 每一天:-)我們所有人...... –

+1

@marc_s你解釋得很好。幹得好,我從中知道一些事情。 –

3

我想你應該試試這個,訂購CAST日期所以通過這種方式,你將執行你想要的操作,你也可以得到你想要的日期格式。

SELECT 
    CONVERT(VARCHAR(10), ac_payout_book_dt, 104) as 'Dato' 
ORDER BY 
    CAST(ac_payout_book_dt AS DATE) DESC 
0

排序時將'Deto'轉換爲'日期'格式。 類似的東西 - ORDER BY CONVERT(DATE,Deto,104)DESC

+1

您正在將'DATETIME'轉換爲'DATE' - 都是** binary ** - 這不起作用,您需要在應用樣式(104)時轉換爲** STRING **, –