如何在 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】:

您必须将列 YearMonthDay 转换为 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 列?

如何在 SQL Server 中加入两个查询的结果?

在sql server中加入两个视图

在 like 语句中加入 SQL Server 表

在 SQL Server Compact 中加入逗号分隔值不起作用

如何在 SQL 中加入包含祖父-父-子列的表?