SQL Sever:从当前年份创建字符串日期

时间:2017-08-31 10:03:39

标签: sql-server sql-server-2008

在我的SQL Server存储过程中,我试图检查当前日期是否在当前年份的两个日期之间:

IF @MyDate BETWEEN '03/02/2017' AND '10/05/2017 23:59'
BEGIN
  // Do some stuff
END

@MyDate是一个日期时间变量,它通过参数传递给我的存储过程。

但我需要对其进行编程才能成功完成工作。现在只在2017年工作,我需要它与2018年,2019年等一起工作。

例如,对于2018年,它将是:

IF @MyDate BETWEEN '03/02/2018' AND '10/05/2018 23:59'
BEGIN
  // Do some stuff
END

2019年将是:

IF @MyDate BETWEEN '03/02/2019' AND '10/05/2019 23:59'
BEGIN
  // Do some stuff
END

等等。日期范围始终相同,只有年份正在变化,所以我需要它自动调整。

那么如何修改条件IF以适应它?

4 个答案:

答案 0 :(得分:0)

DECLARE @MyDate DATETIME = '12-11-2017'
DECLARE @currYear INT = 2017

--Put this part inside a loop or function may be

DECLARE @year VARCHAR(4) = CONVERT(VARCHAR(4), @currYear)
DECLARE @fromDate DATETIME = '03/02/'+@year 
DECLARE @toDate DATETIME = '10/05/'+@year+' 23:59'

IF @MyDate BETWEEN @fromDate AND @toDate
BEGIN
  PRINT '1'
END
ELSE 
BEGIN
  PRINT '2'
END

答案 1 :(得分:0)

按如下所示创建新日期

CAST(CAST(y AS varchar) + '-' + CAST(m AS varchar) + '-' + CAST(d AS varchar) AS DATETIME)

当前年yYEAR(GETDATE),而md是可以从DATEPART生成的月份和日期。有关DATEPART

的使用,请参阅this

在SQL Server 2012之后,功能DATETIMEFROMPARTSDATEFROMPARTS

答案 2 :(得分:0)

使用DATEADD返回一致的年份。在这个例子中,我选择了0001(0000年将更容易使用,但它不是一个有效的SQL Server日期)。

-- All years are set to 0001.
IF DATEADD(YEAR, -(YEAR(@MyDate) -1), @MyDate) BETWEEN '00010203' AND '00010510'
BEGIN

    -- Do stuff...
END

以下是我们如何使用DateAdd的细分:

DATEADD
(
    YEAR,                   -- Tell dateadd we are working with years.
    -                       -- We are going to subtract not add.
    (YEAR(@MyDate) -1),     -- Number of years to remove from @MyDate, to get to 0001. 
    @MyDate                 -- Your date.
)

SQL Server 2012及更高版本包含DateFromParts功能。基本方法是一样的,但在我看来,你最终会得到一个更清晰的陈述。

IF DATEFROMPARTS(1, MONTH(@MyDate), DAY(@MyDate)) BETWEEN '00010203' AND '00010510'

您不需要包含时间戳。 Between包含整个开始和结束日期。除非我误解了,你打算排除5月10日的最后一分钟。

稍微偏离主题但值得一读:SQL Server Date Formats

答案 3 :(得分:0)

您可以使用DATEADD

获取当年的日期
DATEADD(year, datediff(year, '20160302', getdate()), '20160302')

所以你的病情可能是

IF @MyDate BETWEEN DATEADD(year, datediff(year, '20160302', getdate()), '20160302') 
           AND DATEADD(year, datediff(year, '20160510 23:59:59', getdate()), '20160510 23:59:59')