[英]How to order by date when a column is of type nvarchar in Microsoft SQL Server
我有一個問題,我在存儲日期和時間時創建了一個nvarchar
類型的sent_Date
列。
現在,當我嘗試按日期對其進行排序時,它的操作不正確。
我正在使用這個查詢:
select *
from tbl_skip
where sent_date > '9/27/2020 7:29:11 PM'
order by SENT_DATE desc
您可以將數據從字符串轉換為日期時間。
請注意,我以 100 為例轉換為日期時間。 您可以使用以下鏈接查看其行為是否正確。 鏈接-https://www.w3schools.com/sql/func_sqlserver_convert.asp
select *
from tbl_skip
where sent_date > convert(datetime,'9/27/2020 7:29:11 PM',100)
ORDER BY CONVERT(datetime,SENT_DATE,100) desc
正如評論所說,這里真正的解決方案是修復您的設計。 這意味着將列的數據類型從nvarchar
更改為日期和時間數據類型,我將在這里使用datetime2(0)
,因為您的數據精確到一秒,因此看起來最合適。
首先,我們需要將值轉換為 ISO 值。 但是,我還將創建一個名為Bad_Sent_Date
的新列,以存儲無法轉換的值。 經驗告訴我們許多人錯誤地使用字符串數據類型來存儲日期(或數字數據)的系統很少有關於值的良好數據完整性規則(因為如果他們這樣做,它就不會是nvarchar
)開始,所以有錯誤的值,例如'29/09/2020'
29/02/2019'
或混合樣式,例如同時具有'09/29/2020'
和'29/09/2020'
。
基於我們擁有的單個示例,我將假設您的數據應該采用MM/dd/yy hh:mm:ss AM/PM
格式:
ALTER TABLE dbo.tbl_skip ADD Bad_Sent_Date nvarchar(30) NULL;
GO
UPDATE TABLE dbo.tbl_skip
SET Bad_Sent_Date = CASE WHEN TRY_CONVERT(datetime2(0),Sent_date,101) IS NULL THEN Sent_date END,
Sent_Date = CONVERT(nvarchar(30),TRY_CONVERT(datetime2(0),Sent_date,101),126);
GO
現在我們有了 ISO 格式,我們可以更改表的數據類型:
ALTER TABLE dbo.tbl_skip ALTER COLUMN Sent_date datetime2(0) NULL;
請注意,如果您確實對Sent_date
列有約束,或者它不能為NULL
,則您首先需要DROP
所述CONSTRAINT
,將列更改為NULL
,然后在更改列后重新創建所述CONSTRAINT
。
您還可以使用以下命令查看未能轉換的“日期”:
SELECT bad_sent_date
FROM dbo.tbl_skip
WHERE bad_sent_date IS NOT NULL
AND Sent_date IS NULL;
一旦這一切都完成了,那么您的查詢只需要更新以使用明確的日期文字,它就會起作用:
SELECT *
FROM tbl_skip
WHERE sent_date > '2020-09-27T19:29:11' --'9/27/2020 7:29:11 PM'
ORDER BY SENT_DATE DESC;
您應該能夠將其轉換為日期時間
select *
from tbl_skip
where sent_date > '9/27/2020 7:29:11 PM'
order by convert(datetime,SENT_DATE) desc
只要確保列中的數據是合法的。 如果是這樣,將列類型轉換為日期時間是有意義的。
alter table tbl_skip alter column SENT_DATE datetime
如果數據混合,您可能需要修復它或使用類似
order by try_convert(datetime,SENT_DATE) desc
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.