Sql server 如何在SQL Server中连接数字
我在表格中有一些类似的数据:Sql server 如何在SQL Server中连接数字,sql-server,Sql Server,我在表格中有一些类似的数据: year month day ID 2013 1 1 x1 2013 1 2 x2 2013 1 3 x3 2013 1 4 x4 2013
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和customer apply date的customer表,但apply date被拆分为year&mont&day,数据从2013/1/1到2016/4/10,我想获得2014/4/5之后应用的customerID
以下是我尝试的代码:
SELECT *
FROM table
WHERE [Year]+'-'+[Month]+'-'+[Day] > '2014-4-5'
但我得到了这个错误:
[Err]22018-[SQL Server]将varchar值“2014-4-5”转换为数据类型int时失败
谁能帮我?Backs的解决方案很好,编辑起来也很简单:但是不正确,谢谢@t-clausen.dk指出,另一个选择是:
编辑:DATEFROMPARTS仅在sql server 2012及更高版本中可用。Backs的解决方案很好且易于编辑:但不正确,感谢@t-clausen.dk指出,另一个选项是:
编辑:DATEFROMPARTS仅在sql server 2012及更高版本中可用。这取决于语言设置。有关详细信息,请参阅此
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'
这取决于语言设置。有关详细信息,请参阅此
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'
您必须将列年、月、日强制转换为varchar 质疑
您必须将列年、月、日强制转换为varchar 质疑
这应该可以工作并保留您的代码 另一个有用的方法是创建持久化计算列,持久化列是可搜索的,您甚至可以在该列上放置索引:
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
这应该可以工作并保留您的代码 另一个有用的方法是创建持久化计算列,持久化列是可搜索的,您甚至可以在该列上放置索引:
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
试试这个
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
DATEADD(year, [year]-1900, DATEADD(Month, [Month]-1, DATEADD(Day, [Day]-1, 0))) > CAST('2014-4-5' AS DATETIME)
或
选中此项,这将是您问题的解决方案:@David从专栏中生成日期并不是一个好主意。这将不是sargableCheck,这将是你问题的解决方案:@David从专栏中生成日期并不是一个好主意。不会的sargable@Backs解决方案不正确,不允许2015年1月或2015-01年-01@t-我刚刚测试了sql,它运行正常,为什么说解决方案不正确?谢谢@Walker.li他所写的查询在接下来的几年里不会返回,因为月份是从1月到4月5日。它不会返回2014年12月1日至4日、11月等either@t-谢谢你!虽然我无法测试错误,但我会记住它。@Backs解决方案不正确,它不允许2015年1月或2015-01年-01@t-我刚刚测试了sql,它运行正常,为什么说解决方案不正确?谢谢@Walker.li他所写的查询在接下来的几年里不会返回,因为月份是从1月到4月5日。它不会返回2014年12月1日至4日、11月等either@t-谢谢你!虽然我无法测试错误,但我会记住它。[Year]+'-'+[Month]+'-'+[Day]这将返回一个数值和一个不正确的结果,一旦你将其转换为一个日期,如:1905-07-18,第二个答案仍然不正确,你需要转换单个列[Year]+'-'+[Month]+'-'+[Day]这将返回一个数值和一个不正确的结果,一旦您将其转换为日期,如:1905-07-18,第二个答案仍然不正确,您需要转换各个列
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)