1

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

4 回答 4

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

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

于 2013-10-28T09:10:21.607 回答
2

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

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

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

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

(......和相关的小提琴

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

于 2013-10-28T09:07:42.127 回答
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()))
于 2013-10-28T06:56:13.773 回答
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

我还没有检查过。

于 2013-10-28T07:17:31.020 回答