【问题标题】:SQL Server: comparing if a date between date rangeSQL Server:比较日期范围之间的日期
【发布时间】:2017-09-13 01:13:58
【问题描述】:

我有这段代码不工作。 @SomeDateis ofdatetime` 数据类型。我只对日期部分感兴趣,比较时不需要时间:

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 变量时失败,它说:conversion varchar into datetime is out of the interval

尝试 #1:

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)

但不工作

【问题讨论】:

  • 你能更好地定义“不工作”吗?
  • 好吧,你说的是FromData而不是FromDate。如果需要帮助,请清理它。
  • 您使用的是什么版本的 SQL?
  • Xedni 标记为 2008。
  • 非常抱歉,在分配FromDate和ToDate时失败,它说:conversion varchar into datetime is out of the interval

标签: sql sql-server sql-server-2008


【解决方案1】:

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

例如

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

【讨论】:

  • 您的脚本缺少一些需要运行的组件。声明 @SomeDate 并分配它,然后在 if 子句之后放置一些内容。在我的回复中提供一个例子
  • someDate 作为日期时间传递给我的存储过程
  • 我明白了。但是您的脚本(可能)失败的原因是因为您在帖子中编写了它,它无法运行。如果你充实它,它应该运行得很好。如果不是,请提供您仍然遇到的确切错误。
【解决方案2】:

你可以稍微简化一下

示例(参见声明@FromDate 和@ToDate)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2016-09-19
    相关资源
    最近更新 更多