我有两个数字作为用户的输入,例如 1000和1050.
如何在单独的行中使用SQL查询生成这两个数字之间的数字?我要这个:
1000
1001
1002
1003
.
.
1050
Run Code Online (Sandbox Code Playgroud) 我已经看到了许多不同的方法来创建和填充数字表.但是,创建和填充一个的最佳方法是什么?从最重要到最不重要的"最佳"被定义:
如果你不知道数字表是什么,请看这里:我为什么要考虑使用辅助数字表?
考虑需要创建日期的结果集.我们有开始和结束日期,我们想要生成两者之间的日期列表.
DECLARE @Start datetime
,@End datetime
DECLARE @AllDates table
(@Date datetime)
SELECT @Start = 'Mar 1 2009', @End = 'Aug 1 2009'
--need to fill @AllDates. Trying to avoid looping.
-- Surely if a better solution exists.
Run Code Online (Sandbox Code Playgroud)
考虑使用WHILE循环的当前实现:
DECLARE @dCounter datetime
SELECT @dCounter = @Start
WHILE @dCounter <= @End
BEGIN
INSERT INTO @AllDates VALUES (@dCounter)
SELECT @dCounter=@dCounter+1
END
Run Code Online (Sandbox Code Playgroud)
问题:如何使用T-SQL创建一组在用户定义范围内的日期?假设SQL 2005+.如果您的答案是使用SQL 2008功能,请标记为.
可能重复:
在一系列日期之间获取日期
假设我有2个日期(仅限日期部分,没有时间),我希望获得这两个日期之间的所有日期,并将它们插入表格中.有没有一种简单的方法来使用SQL语句(即没有循环)?
Ex:
Date1: 2010-12-01
Date2: 2010-12-04
Table should have following dates:
2010-12-01, 2010-12-02, 2010-12-03, 2010-12-04
Run Code Online (Sandbox Code Playgroud) 首先,感谢任何帮我解决这个问题的人.我正在使用SQL 2005,但如果05中没有可用的解决方案,则可以使用2008.
我有一行看起来像这样的数据:
select * from mySPtable
| myPK | Area | RequestType | StartDate | EndDate |
1 SB ADD 8/14/2011 8/18/2011
2 NB RMV 8/16/2011 8/16/2011
Run Code Online (Sandbox Code Playgroud)
所以我想做的是按天计算每个区域的总请求数.结果应该是:
| myDate | RequestType | Area | myCount |
8/14/2011 ADD SB 1
8/15/2011 ADD SB 1
8/16/2011 ADD SB 1
8/16/2011 RMV NB 1
8/17/2011 ADD SB 1
8/18/2011 ADD SB 1
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?我很难过,没有任何谷歌搜索帮助.
将问题的答案分解为"将一列拆分为多行",我在此重新编写为[1].
什么是(含义)Type = 'P'以及为什么使用未记录的master..spt_values来拆分列?它有什么好处?
[1]
CREATE TABLE dbo.Table1
(
Col1 CHAR(1),
Col2 CHAR(1),
Col3 CHAR(1),
Col4 VARCHAR(50)
)
GO
INSERT INTO dbo.Table1 VALUES ('A','B','C','1,2,3')
GO
INSERT INTO dbo.Table1 VALUES ('D','E','F','6,7,8,9')
GO
SELECT
T.col1, RIGHT(LEFT(T.col4,Number-1),
CHARINDEX(',',REVERSE(LEFT(','+T.col4,Number-1))))
FROM
master..spt_values,
table1 T
WHERE
Type = 'P' AND Number BETWEEN 1 AND LEN(T.col4)+1 AND
(SUBSTRING(T.col4,Number,1) = ','
-- OR SUBSTRING(T.col4,Number,1) = '') --this does not work correctly anyway
Run Code Online (Sandbox Code Playgroud)
相关问题:
我有一个包含2列整数的表.第一列表示起始索引,第二列表示结束索引.
START END
1 8
9 13
14 20
20 25
30 42
42 49
60 67
Run Code Online (Sandbox Code Playgroud)
简单到目前为止.我想要做的是将所有记录组合在一起:
START END
1 25
30 49
60 67
Run Code Online (Sandbox Code Playgroud)
记录可以跟在上一个结束索引的相同索引处开始,或者以1的边距开始:
START END
1 10
10 20
Run Code Online (Sandbox Code Playgroud)
和
START END
1 10
11 20
Run Code Online (Sandbox Code Playgroud)
将导致
START END
1 20
Run Code Online (Sandbox Code Playgroud)
我正在使用SQL Server 2008 R2.
任何帮助都会很棒
快速版:以下是最好的,为什么?(或者,还有更好的方法):
SELECT FLOOR(LOG10(Number))+1 AS NumLength FROM Table
SELECT LEN(CONVERT(VARCHAR, Number)) AS NumLength FROM Table
SELECT LEN(CAST(Number AS VARCHAR(10))) AS NumLength FROM Table
Run Code Online (Sandbox Code Playgroud)
更详细一点:
我希望找出最有效的机制来计算整数的字符串表示的长度(更具体地说,是一个自然数 - 总是> 0).
我正在使用MS SQL Server(2005).
我已经提出了上面的3种解决方案,所有这些解决方案似乎都运行良好.
我知道第三个版本可能存在非常大的整数问题,但是现在我们可以假设"数字"长度不超过9位十进制数.
更详细的说明:( 你不必阅读这一点来回答我的问题)
这个查询在事务处理环境中被大量使用.
到目前为止,我已经假设"数字"总是正好是6位数.
但是,现在我必须更新代码以支持4到9位数字.
此SQL是识别卡的卡方案的条件的一部分.
完整查询尝试在开始和结束范围内查找与卡号开头匹配的记录.
所以完整的SQL条件将是这样的:
WHERE
-- Start and End match
((Start=End OR End=0) AND (Start=CAST(LEFT('<card number>', FLOOR(LOG10(Start))+1) AS BIGINT))) OR
-- Start != End
-- >= Start
(Start<=CAST(LEFT('<card number>', FLOOR(LOG10(Start))+1) AS BIGINT) AND
-- <= End
End>=CAST(LEFT('<card number>', FLOOR(LOG10(Start))+1) AS BIGINT))
Run Code Online (Sandbox Code Playgroud)
注意:
我可以重新设计表以使用VARCHAR而不是INT.这将允许我使用"LEN(开始)"而不是"FLOOR(LOG10(开始))+ …
如果没有循环或游标,您如何获取日期间隔列表并将它们转换为1和0的字符串,以便:
例如,如果间隔是:
然后你编写的SQL应该输出11011.这是你可以使用的安装脚本:
declare @TimeSpan table
(
start datetime
,finish datetime
)
-- this is a good data set, with overlapping and non-overlapping time spans
insert into @TimeSpan values ('02/02/2010', '02/02/2010')
insert into @TimeSpan values ('02/03/2010', '02/03/2010')
insert into @TimeSpan values ('02/04/2010', '02/05/2010')
insert into @TimeSpan values ('02/05/2010', '02/06/2010')
insert into @TimeSpan values ('02/07/2010', '02/09/2010')
insert into @TimeSpan values ('02/08/2010', '02/08/2010')
insert into @TimeSpan values ('02/08/2010', '02/10/2010')
insert into @TimeSpan values ('02/14/2010', '02/16/2010')
-- for …Run Code Online (Sandbox Code Playgroud) 我有下表.
Table A:
ID ProductFK Quantity Price
------------------------------------------------
10 1 2 100
11 2 3 150
12 1 1 120
----------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我需要根据订单列值选择重复行N次.
所以我需要以下选择结果:
ID ProductFK Quantity Price
------------------------------------------------
10 1 1 100
10 1 1 100
11 2 1 150
11 2 1 150
11 2 1 150
12 1 1 120
Run Code Online (Sandbox Code Playgroud)