下个月选择字段(char6)

时间:2013-10-28 06:45:51

标签: sql sql-server

我需要为下个月选择字段State的值。 字段Month是char(6)。例如:201310

这就是我所拥有的,它不起作用:

SELECT Code, Name, (SELECT State FROM dbo.ShiftList WHERE (MONTH(CONVERT(Date, Month)) = MONTH(GETDATE()) + 1)) AS SLNM FROM dbo.Shops

4 个答案:

答案 0 :(得分:4)

对于性能问题,它更倾向于使用变量进行操作,而不是使用表中的数据进行操作。在这种情况下,您的查询可能如下所示:

SELECT
  Code,
  Name,
  (SELECT State
   FROM dbo.ShiftList 
   WHERE MONTH = cast(year(dateadd(month, 1, getdate())) * 100
                + month(dateadd(month, 1, getdate())) as char(6))
) AS SLNM
FROM dbo.Shops

这种结构使得索引的使用成为可能。

答案 1 :(得分:2)

当前的答案都有一个主要问题 - 他们在列上调用的函数意味着将很可能忽略索引。我更喜欢SARGable条件,谢谢:

SELECT state
FROM dbo.ShiftList 
WHERE month = FORMAT(DATEADD(month, 1, GETDATE()), 'yyyyMM')

(拥有SQL Fiddle Example - 未来将使用特定日期,因此该示例将来仍有效。)
但是,这仅适用于SQL Server 2012.对于以前的版本,您需要稍微不同的版本:

SELECT state
FROM dbo.ShiftList 
WHERE month = CONVERT(CHAR(6), DATEADD(month, 1, CAST('20131201' as date)), 112)

(......和相关的fiddle

请注意,这有一个潜在的问题 - 优化器可能决定在最终结果集中为每个行调用此子查询。但是,如果没有关于表和数据的更多信息,我们无法确定是否有某种方法可以改进整体查询。

答案 2 :(得分:0)

如果您将字段“月份”中的固定格式设置为“YYYYMM”,则可以将年份和月份取为:

select RIGHT([Month],2) AS MONTH ,LEFT([Month],4) AS YEAR
FROM dbo.ShiftList

并将所需的'州'值视为:

SELECT [State] 
 FROM dbo.ShiftList 
 WHERE  RIGHT([Month],2) = MONTH(DATEADD(month, 1, GETDATE())) 
 AND LEFT([Month],4) = YEAR(DATEADD(month, 1, GETDATE()))

答案 3 :(得分:0)

试试这个:

SELECT Code, Name, (SELECT State FROM dbo.ShiftList WHERE (MONTH(DATEADD(MONTH, Month / 100 * 12 - 22800 + Month % 100, -1))) = MONTH(GETDATE()) + 1)) AS SLNM FROM dbo.Shops

我还没检查过。