我需要一个 SQL 查询,它将根据日历增加此查询中的月份。当系统日历更改为新月份时,when
子句中的日期字符串也必须更改:
UPDATE dbo.dim_time
SET last12 =
CASE
WHEN date < '2012-09-01' THEN 'No'
ELSE 'Yes'
END
这个月是date < '2012-09-01'
。
下个月它应该会自动更改为date < '2012-10-01'
.
我需要一个 SQL 查询,它将根据日历增加此查询中的月份。当系统日历更改为新月份时,when
子句中的日期字符串也必须更改:
UPDATE dbo.dim_time
SET last12 =
CASE
WHEN date < '2012-09-01' THEN 'No'
ELSE 'Yes'
END
这个月是date < '2012-09-01'
。
下个月它应该会自动更改为date < '2012-10-01'
.
如果您错误地提到了 2012 年而不是 2013 年,那么下面的查询将执行此操作。
Update dbo.dim_time
Set last12 =
Case
When date < CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(getdate())-1),getdate()),101)
then 'No'
Else 'Yes'
End
Update dbo.dim_time
Set last12 =
Case
WHEN date < DATEADD(M,MONTH(GETDATE()),DATEADD(YYYY,YEAR(GETDATE())-2000,'12-01-1999'))
then 'No'
Else 'Yes'
End
利用DATEDIFF
Update dbo.dim_time
Set last12 = Case When DateDiff(m,date,getdate())>12 then 'No' Else 'Yes' End
如果您使用的是 MS SQL Server 2012,您可以使用以下函数构建日期
例如
Update dbo.dim_time
Set last12 =
Case
When date < DATEFROMPARTS(year(getdate())-1, month(getdate()),1) then 'No'
Else 'Yes'
End
试试这个 SQL
UPDATE dbo.dim_time
SET last12 =
CASE
WHEN DATE < cast(CAST(Year(getdate()) as NVARCHAR(10)) + '-' + CAST(Month(getdate())as NVARCHAR(10)) +'-01' as Date)
THEN 'No'
Else 'Yes'
END
我认为您可能最好使用计算列,这样您就不需要每月继续更新。
create table #DimDate
([date] Date, last12 varchar(5))
INSERT INTO #DimDate
SELECT dateAdd(m, X.c, getdate()), 'No'
FROM
(Values (-1),(-2),(-3),(-4),(-5),(-6),(-7),(-8),(-9),(-10),(-11),(-12),(-13),(-14),(-15),(-16)) AS X(c)
ALTER TABLE #DimDate
DROP COLUMN last12
ALTER TABLE #DimDate
ADD last12 AS Case When DateDiff(m,date,getdate())>12 then 'No' Else 'Yes' End
SELECT *
FROM #DimDate
您需要用表达式替换日期字符串。这个表达式会给你当月的第一天:
dateadd(month, datediff(month,0,GETDATE()), 0)
由于 2012-09-01 是从当月开始的 34 个月前,因此您可以计算当月开始前的 30 个月:
dateadd(month, datediff(month,0,GETDATE()) - 34, 0)
因此,您的更新声明将是:
Update dbo.dim_time
Set last12 =
Case When date < dateadd(month, datediff(month,0,GETDATE()) - 34, 0) then
'No'
Else
'Yes'
End
使用GetDate()
...带有日期的当前月份..从中比较您的字段值,如果为真,则更改否则保持原样..