如何在 SQL Server 中加入数字
Posted
技术标签:
【中文标题】如何在 SQL Server 中加入数字【英文标题】:How to join numbers in SQL Server 【发布时间】:2016-04-13 09:24:13 【问题描述】:我在表格中有一些这样的数据:
year month day ID
2013 1 1 x1
2013 1 2 x2
2013 1 3 x3
2013 1 4 x4
2013 1 5 x5
2013 1 6 x6
...
2016 4 10 x1500
此表是一个客户表,其中包含 customerID 和客户申请日期,但申请日期分为 year & mont & day ,数据从 2013/1/1 到 2016/4/10 ,我想获取 customerID 2014/4/5之后申请。
这是我尝试过的代码:
SELECT *
FROM table
WHERE [Year]+'-'+[Month]+'-'+[Day] > '2014-4-5'
但我得到了这个错误:
[Err] 22018 - [SQL Server]将 varchar 值“2014-4-5”转换为数据类型 int 时转换失败。
谁能帮帮我?
【问题讨论】:
检查一下,这将是您问题的解决方案:***.com/questions/266924/create-a-date-with-t-sql @David 从列中生成日期并不是一个好主意。它不会是 sargable 【参考方案1】:这应该可以工作并保留您的代码sargable
SELECT *
FROM table
WHERE
[Year] = 2014 and [Month] = 4 and [Day] > 5
OR [Year] > 2014
OR [Year] = 2014 and [Month] > 4
另一种有用的方法是创建一个 PERSISTED 计算列,持久化列是 sargable,您甚至可以在该列上放置一个索引:
ALTER TABLE <tablename> ADD actualdate AS
CONVERT(date, cast(year as varchar(4))+'-' +
cast(month as varchar(2)) +'-'+ cast(day as varchar(2)), 126) PERSISTED
然后你可以简单地输入
WHERE actualdate > '2014-04-05'
【讨论】:
【参考方案2】:Backs 的解决方案既好又简单(编辑:但不正确,感谢@t-clausen.dk 指出),另一个选项是DATEFROMPARTS():
WHERE DATEFROMPARTS([Year], [Month], [Day]) > '2014-04-05'
编辑:DATEFROMPARTS() 仅在 sql-server 2012 及更高版本中可用。
【讨论】:
@Backs 解决方案不正确,它不允许 2015 年 1 月或 2015-01-01 @t-clausen.dk 我刚刚测试了sql,它运行正常,为什么你说解决方案不正确?谢谢! @Walker.li 他写的查询将不会返回从 1 月到 4 月 5 日的任何后续年份。它也不会返回 2014 年 12 月 1-4 日、11 月等 @t-clausen.dk 谢谢!虽然我无法测试出错误,但我会记住的。【参考方案3】:这取决于语言设置。有关更多信息,请参阅此answer..
create table #test
(
year int,
month int,
date int,
name char(20)
)
insert into #test
select 2012,1,14,'ab'
;with cte
as
(
select *, datefromparts(year,month,date) as datee
from #test
)
select * from cte where date>'somedate'
【讨论】:
【参考方案4】:试试这个,
SELECT *
FROM TABLE WHERE
DATEADD(year, [year]-1900, DATEADD(Month, [Month]-1, DATEADD(Day, [Day]-1, 0))) > CAST('2014-4-5' AS DATETIME)
(或)
SELECT *
FROM table
WHERE CAST(CAST([Year]+'-'+[Month]+'-'+[Day] AS VARCHAR(15)) AS DATETIME > CAST('2014-4-5' AS DATETIME)
【讨论】:
[Year]+'-'+[Month]+'-'+[Day] 这将返回一个数值和不正确的结果,一旦您将其转换为日期,如:1905 -07-18, 第二个答案仍然不正确,您需要转换各个列【参考方案5】:您必须将列 Year
、Month
和 Day
转换为 varchar
。
查询
SELECT * FROM Customer
WHERE CAST((
CAST([Year] as varchar(4)) + '-' +
CAST([Month] as varchar(2)) + '-' +
CAST([Day] as varchar(2)))
) > '2014-04-05';
【讨论】:
以上是关于如何在 SQL Server 中加入数字的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server Management Studio 中加入 3 列?