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)