我有一份報告要做,所以我需要從datetime列中回傳一個日期,但它只需要與列中的日期一起出現。
我正在使用 Microsoft SQL Server 2014。我已經嘗試過使用CONVERT(name_of_the_column, GETDATE()),但我意識到它只能從服務器回傳當前日期時間。
我怎樣才能做到這一點?
uj5u.com熱心網友回復:
使用CONVERT(DATE, <expression>).
create table t (dt datetime);
insert into t (dt) values ('2022-10-20 12:34:56');
select *, CONVERT(DATE, dt) from t;
結果:
dt (No column name)
----------------------- ----------
2022-10-20 12:34:56.000 2022-10-20
請參閱db<>fiddle中的示例。
uj5u.com熱心網友回復:
我更喜歡使用 CAST。
CAST(name_of_the_field AS DATE)
uj5u.com熱心網友回復:
我需要從日期時間列回傳日期
為了完全回答這個問題,有幾件事需要介紹。
首先,如果那真的是一datetime列,那么這里要理解的是datetime值總是有時間分量。它甚至就在名稱中。沒有辦法回傳datetime沒有時間部分的值。您可以獲得的最接近的方法是轉換為字串 or date,但這并不是一回事。通常發生的事情是時間部分被截斷回午夜(全 0)......但那個時間部分仍然存在。這就是你看到這樣的答案的地方:
dateadd(dd, datediff(dd,0, name_of_the_column), 0)
或這個:
CONVERT(varchar(10), name_of_the_column,101)
接下來要了解的是,您不應該做的一件事是將日期值轉換為字串,如第二個示例所示。
由于文化/國際化問題,日期時間或數值與字串之間的轉換比您想象的要慢得多且更容易出錯。這是要避免的事情,最好留給您的客戶端代碼或報告工具。
最后一個考慮因素是datetime價值觀永遠不會有任何時區意識(這將涉及datetime2)。因此,如果客戶端上有任何內容可以在本地時間顯示此內容,則可能選擇了錯誤的偏移量。使用時間部分已經被截斷的值來執行此操作,您可能會得到意想不到的結果。
把所有這些放在一起,你應該做的CAST()是DATE:
CAST(name_of_the_column AS DATE)
現在,我已經看到此建議對另一個答案的評論:
時光倒流
這可能是我已經提到的時區不匹配,或者也可能name_of_the_column首先不是真正的日期時間列,而是偽裝成日期時間列的字串/varchar 列。在這種情況下,CAST()可能會使用與您預期不同的文化規則來決議值。它又回到了整個“更慢、更容易出錯/要避免的事情”的事情上。同樣在這種情況下,架構被認為是損壞的,您確實應該修復它以使用實際 datetime值或datetime2值。
說到“修復它”,我還注意到了 SQL Server 2014 標簽。SQL Server 2014 自 2019 年以來已完全終止。這意味著它沒有收到任何更新——甚至沒有收到關鍵的安全補丁!——現在已經好幾年了。仍然使用它是危險和不負責任的。更新到受支持的版本是這里的作業 #1。
uj5u.com熱心網友回復:
我不知道為什么,但是回傳我想要達到的結果的唯一方法是使用
CONVERT(VARCHAR, TB.COLUM, 103) AS 'NAME'.
但如前所述,這不是一個好習慣,而且我決定在我正在作業的系統的報告工具中進行轉換
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/521385.html
