簡體   English   中英

在SQL Server的where或Order by子句中的字符串中連接常量值?

[英]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)
);

SQL小提琴示例

如果您這樣嘗試怎么辦

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.

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