SQL Server:比较日期是否介于日期范围之间
我有一个不工作的代码@SomeDateSQL 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 + '-' +
属于
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