1

我正在尽我所能设置一个日期变量,以便稍后进行比较。我想要一些基本上说的东西:

如果当前日期小于 11,则日期为上个月的 10 号
如果当前月份的日期大于或等于 11,则日期为本月的 ​​10 号

日期为 11/6/2012 预期输出:

@PODate = 10/10/2012

日期为 11/16/2012 预期输出:

@PODate = 11/10/2012

目前我只有这个:

DECLARE @PODate as DATETIME
Set @PODate = Convert(varchar(8),GetDate(),1)

任何提示或帮助将不胜感激。谢谢!!

4

4 回答 4

2

尽量保持简单:

declare @PODate datetime
select @PODate = DATEADD(month,
   DATEDIFF(month,'20010110',CURRENT_TIMESTAMP) +
      CASE WHEN DATEPART(day,CURRENT_TIMESTAMP) <= 10 THEN -1 ELSE 0 END,
   '20010110')

周围的DATEADD/DATEDIFF对用于将日期标准化为当月的 10 日。CASE然后,如果日期小于或等于 10 日,我们使用一个小表达式减去一个月。


无论您选择哪种解决方案,请尽量避免将其作为字符串操作的解决方案。SQL中相关错误的常见原因datetime是人们将日期视为字符串。适当地保留数据类型通常是防止这些问题的最佳方法。

诚然,我的解决方案中有 2 个字符串,但它们是固定不变的字符串(重要的是它们都是同一年和同一月,第二个是每月 10 号)并且在明确的格式。

于 2012-11-07T08:35:36.493 回答
1
DECLARE @PODate date = '20121116'
SELECT CASE WHEN DATEPART(day, @PODate) < 11 THEN DATEADD(mm, DATEPART(mm, GETDATE()) - DATEPART(mm, @PODate) - 1, DATEADD(day, 10 - DATEPART(day, @PODate), @PODate))
                                             ELSE DATEADD(mm, DATEPART(mm, GETDATE()) - DATEPART(mm, @PODate), DATEADD(day, 10 - DATEPART(day, @PODate), @PODate)) END

SQLFiddle上的演示

于 2012-11-07T08:12:35.620 回答
1

试试这个:SQL 小提琴

DECLARE 
    @PODate as DATETIME,
    @LastMonth as DateTime,
    @strDate as Varchar(50)

set @PODate = '11/16/2012'
set @LastMonth = DATEADD(MONTH, -1, @PODate)


if(DAY(@PODate) < 11)
   SET @strDate = CAST(MONTH(@LastMonth) AS VARCHAR)+'/10/'+CAST(YEAR(@LastMonth) AS VARCHAR)
else
   SET @strDate = CAST(MONTH(@PODate) AS VARCHAR)+'/10/'+CAST(YEAR(@PODate) AS VARCHAR)

Select CAST(@strDate AS DateTime)
于 2012-11-07T03:34:19.823 回答
0
DECLARE @currDate DATE = dbo.GetDate()
DECLARE @day INT =  day(@currDate)
DECLARE @month INT 
DECLARE @year INT

DECLARE @PODate DATE

IF( @day >= 11)
BEGIN
    SET @month = month(@currDate)
    SET @year = year(@currDate)
END 
ELSE BEGIN
    SET @month =  month(dateadd(m,-1,@currDate))
    SET @year = year(dateadd(m,-1,@currDate))       
END

SET @PODate = convert(DATE,'10-' + convert(VARCHAR,@month) + '-' + convert(VARCHAR,@year))

PRINT    @PODate

如果@currDate = '11-jan-2013',@PODate 将是'10-jan-2013', 如果@currDate = '07-jan-2013',@PODate将是'10-Dec-2012'

于 2012-11-07T03:32:24.287 回答