Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:比较日期是否介于日期范围之间_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

SQL Server:比较日期是否介于日期范围之间

SQL Server:比较日期是否介于日期范围之间,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个不工作的代码@SomeDate属于datetime`数据类型。我只对日期部分感兴趣,比较时不需要时间: DECLARE @year VARCHAR = datepart(year,@SomeDate) DECLARE @FromDate DATE = CAST(@year + '-' + CAST(1 AS varchar) + '-' + CAST(1 AS varchar) AS DATETIME) DECLARE @ToDate DATE = CAST(@year + '-' +

我有一个不工作的代码@SomeDate
属于
datetime`数据类型。我只对日期部分感兴趣,比较时不需要时间:

DECLARE @year VARCHAR = datepart(year,@SomeDate)
DECLARE @FromDate DATE = CAST(@year + '-' + CAST(1 AS varchar) + '-' + CAST(1 AS varchar) AS DATETIME)
DECLARE @ToDate DATE = CAST(@year + '-' + CAST(5 AS varchar) + '-' + CAST(1 AS varchar) AS DATETIME)

IF (@SomeDate NOT BETWEEN @FromDate AND @ToDate)
分配@FromDate和@ToDate变量时失败,它说:将varchar转换为datetime超出了时间间隔

尝试#1:


但是不工作

它失败了,因为您没有为任何varchar指定长度。看看@Year的结果。它将是
*
(不指定长度将被视为varchar(1),在本例中SQL将其扭曲为星号)。将@year的长度指定为varchar(4)(并在cast语句中执行相同的操作)。您应该养成始终指定数据类型长度的习惯,以避免此类问题

e、 g


你可以简化一下

示例(请参见Declare@FromDate和@ToDate)

返回

FromDate    ToDate      SomeDate    IsBetween
2017-01-01  2017-05-01  2017-09-12  No

你能更好地定义“不工作”吗?首先,你说的是从数据而不是从日期。如果需要帮助,请清理它。您使用的SQL版本是什么?Xedni its tagged 2008。非常抱歉,在分配FromDate和ToDate时失败,它说:将varchar转换为datetime超出了间隔。您的脚本缺少一些需要运行的组件。描述
@SomeDate
并分配它,然后在
if
子句后面加上某物。在我的ResponseMode中提供了一个示例,它作为datetime传递给我的存储过程,我得到了。但是你的脚本失败的原因(大概)是因为正如你在文章中所写的,它是不可运行的。如果你充实它,它应该运行得很好。如果不是,请提供您仍然得到的确切错误。
declare @someDate datetime = getdate()

DECLARE @year VARCHAR(4) = datepart(year,@SomeDate)
DECLARE @FromDate DATE = CAST(@year + '-' + CAST(1 AS varchar(2)) + '-' + CAST(1 AS varchar(2)) AS DATETIME)
DECLARE @ToDate DATE = CAST(@year + '-' + CAST(5 AS varchar(2)) + '-' + CAST(1 AS varchar(2)) AS DATETIME)

IF (@SomeDate NOT BETWEEN @FromDate AND @ToDate)
select 1
Declare @SomeDate date = GetDate()

Declare @FromDate date = DateName(YEAR,@SomeDate)+'0101'
Declare @ToDate   date = DateName(YEAR,@SomeDate)+'0501'

Select FromDate = @FromDate
      ,ToDate   = @ToDate
      ,SomeDate = @SomeDate
      ,IsBetween = case when @SomeDate between @FromDate and @ToDate then 'Yes' else 'No' end
FromDate    ToDate      SomeDate    IsBetween
2017-01-01  2017-05-01  2017-09-12  No