我需要为下个月选择字段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
答案 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
我还没检查过。