我有一个start_date和end_date。我想获取GETDATE()之间的日期列表。任何人都可以帮我指出我的查询中的错误

时间:2017-09-19 09:54:30

标签: sql-server sql-server-2012 sql-server-2016

我在下面的查询中收到错误。

查询

microbenchmark

错误

  

Msg 242,Level 16,State 3,Line 1 varchar数据的转换   键入日期时间数据类型会导致超出范围的值。

1 个答案:

答案 0 :(得分:1)

我怀疑您是在收到错误,因为您从GETDATE()开始计算年份和月份,然后从Expiry_Date追加当天。

如果您的Expiry_Date值中的任何一个值为31,则该值将在9月份无效,GETDATE()将返回:

运行以下内容:

SELECT CONVERT(DATETIME,
                  CONVERT(VARCHAR, YEAR(GETDATE())) + '/' + 
                  CONVERT(VARCHAR, MONTH(GETDATE())) + '/' + 
                  CONVERT(VARCHAR, 31) -- Fails with 31
              ) AS Exp_date1;

错误:

  

Msg 242,Level 16,State 3,Line 1   将varchar数据类型转换为日期时间数据类型会导致超出范围的值。

这个有用的地方:

SELECT CONVERT(DATETIME,
                  CONVERT(VARCHAR, YEAR(GETDATE())) + '/' + 
                  CONVERT(VARCHAR, MONTH(GETDATE())) + '/' + 
                  CONVERT(VARCHAR, 30) -- Works with 30
              ) AS Exp_date1;

您需要在逻辑中考虑天数和月值,或者以更好的方式使用Expiry_Date。我不确定您为什么要在当前年份和月份追加任何日期值。如果要将值过滤到当前月份,请使用where子句首先检查值。