簡體   English   中英

當列在 Microsoft SQL Server 中為 nvarchar 類型時如何按日期排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM