[英]Concatenate Constant value in string in where or Order by clause in sql server?
我有一列名為BillsOfMonth (nvarchar),其中我只有月份和年份值,格式為Jan-2014、2014年2月,2014年3月
我想將其轉換為日期格式並按日期排序。 我努力了
select rid
, name
, billsofmonth
from reports
order by
CONVERT (datetime, "1-" & billsofmonth)
由於2014年1月的“ 1-”和billsOfMonth將變為“ 2014年1月1日”。
但是convert僅在Columns中有效。
如何將常量字符串連接到BillsOfMonth列並將其轉換為日期? 我無法制作功能和T語句。 我只能使用查詢。
您應該使用單引號而不是雙引號,並且還應使用+
not &
連接字符串:
ORDER BY CONVERT(DATETIME, N'1-' + billsofmonth);
對於它的價值,不需要將其存儲為NVARCHAR,VARCHAR會很好用,因為您使用的格式中沒有非ascii字符。 本文有關選擇錯誤的數據類型的文章非常有用。 盡管最好還是將其存儲為日期,使其成為月份的第一天,然后放入檢查約束以確保僅使用月份的第一天。 例如
CREATE TABLE Reports
(
BillsOfMonth DATE NOT NULL,
CONSTRAINT CHK_Reports_BillsOfMonth CHECK (DATEPART(DAY, BillsOfMonth) = 1)
);
這樣可以在比較時提供更大的靈活性,並確保數據完整性,即在您的列中我可以輸入“ xxxxxxx”,該列可以很好地輸入,但是當您運行轉換為日期時間時,將引發錯誤。 檢查約束將停止所有無效條目,因此如果我運行:
INSERT Reports (BillsOfMonth) VALUES ('20140502');
我會得到錯誤:
INSERT語句與CHECK約束“ CHK_Reports_BillsOfMonth”沖突。 數據庫“ TestDB”的表“ dbo.Reports”的列“ BillsOfMonth”中發生了沖突。
然后,如果您經常需要MMM-yyyy
格式的日期,則可以添加一個計算列:
CREATE TABLE Reports
(
BillsOfMonth DATE NOT NULL,
BillsOfMonthText AS LEFT(DATENAME(MONTH, BillsOfMonth), 3) + '-' + DATENAME(YEAR, BillsOfMonth),
CONSTRAINT CHK_Reports_BillsOfMonth CHECK (DATEPART(DAY, BillsOfMonth) = 1)
);
如果您這樣嘗試怎么辦
select rid,
name,
convert (datetime, (N'1-'+billsofmonth)) as NewBills
from reports
order by NewBills
我發現我做錯了。 在Sql Server中,我們使用單反逗號(')進行常量表達,而不是使用雙反逗號(“)。
通過CAST從[報告]順序中選擇[rid],[name],[billsofmonth]((“ 1-” + billsofmonth)作為日期時間)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.