从字符串转换为日期时间T-SQL

从字符串转换为日期时间T-SQL,sql,sql-server,tsql,Sql,Sql Server,Tsql,如何使用日期-时间字段检索特定月份假设我有下表 ID - DATETIME - AMOUNT 01 - 27/05/2017 - 1 02- 02/06/2017 - 2 03- 03/07/2017 - 1 04- 05/05/2017 - 2 05- 13/06/2017 - 3 编写查询以检索May only的记录的正确方法是什么 我使用了以下查询,但它给了我错误 从TABLE.DATETIME='2017年5月' 您可以使用它,但如果TABLE.DATETIME列上有索引,则不会使用它

如何使用日期-时间字段检索特定月份假设我有下表

ID - DATETIME - AMOUNT
01 - 27/05/2017 - 1
02- 02/06/2017 - 2
03- 03/07/2017 - 1
04- 05/05/2017 - 2
05- 13/06/2017 - 3
编写查询以检索May only的记录的正确方法是什么 我使用了以下查询,但它给了我错误

从TABLE.DATETIME='2017年5月'


您可以使用它,但如果TABLE.DATETIME列上有索引,则不会使用它:

SELECT * 
FROM   TABLE 
WHERE  MONTH(TABLE.DATETIME) = 5
   AND YEAR(TABLE.DATETIME) = 2017
如果您已经或计划添加索引来执行以下操作,则可能会更有效:

SELECT * 
FROM   TABLE 
WHERE  TABLE.DATETIME >= '20170501'
   AND TABLE.DATETIME < '20170601' 

您可以使用它,但如果TABLE.DATETIME列上有索引,则不会使用它:

SELECT * 
FROM   TABLE 
WHERE  MONTH(TABLE.DATETIME) = 5
   AND YEAR(TABLE.DATETIME) = 2017
如果您已经或计划添加索引来执行以下操作,则可能会更有效:

SELECT * 
FROM   TABLE 
WHERE  TABLE.DATETIME >= '20170501'
   AND TABLE.DATETIME < '20170601' 

对照月初和月底进行检查

where DateTime >= '20170501' and
      DateTime < '20170601'

对照月初和月底进行检查

where DateTime >= '20170501' and
      DateTime < '20170601'

或者您可以使用between子句:

SELECT *
FROM TABLE 
WHERE TABLE.DATETIME BETWEEN '01/05/2017' AND '31/05/2017'

或者您可以使用between子句:

SELECT *
FROM TABLE 
WHERE TABLE.DATETIME BETWEEN '01/05/2017' AND '31/05/2017'

DATETIME是日期还是VARCHAR?它是日期时间还是日期。如果是varchar,则不会出现转换错误。DATETIME是DATE还是varchar?是DATETIME还是DATE。如果是varchar,则不会出现转换错误。仅当列DateTime的类型为date时。如果是datetime,则不会获得时间部分大于00:00的值为20170531的行。仅当列datetime类型为date时。如果是datetime,则不会获得时间部分大于00:00的值为20170531的行。@Nawaf如果您不想使用在列上使用函数的版本,则。它将阻止您使用索引来定位所需的行。@MikaelEriksson您能详细说明一下吗?@MikaelEriksson和我的意思是,如果您在函数年查询属性,那么sum、convert等sql server将无法对该属性使用索引。因此,如果您在该属性上有索引,则不带函数的查询将比带函数的查询快得多。@Nawaf如果您不想使用在列上使用函数的版本,则。它将阻止您使用索引来定位所需的行。@MikaelEriksson您能详细说明一下吗?@MikaelEriksson和我的意思是,如果您在函数年查询属性,那么sum、convert等sql server将无法对该属性使用索引。因此,如果在该属性上有索引,那么不带函数的查询将比带函数的查询快得多。从性能和简单性的角度来看,这是最好的答案。从性能和简单性的角度来看,这是最好的答案。