相关疑难解决方法(0)

如何在两个数字之间生成一系列数字?

我有两个数字作为用户的输入,例如 10001050.

如何在单独的行中使用SQL查询生成这两个数字之间的数字?我要这个:

 1000
 1001
 1002
 1003
 .
 .
 1050
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2008

120
推荐指数
14
解决办法
18万
查看次数

创建和填充数字表的最佳方法是什么?

我已经看到了许多不同的方法来创建和填充数字表.但是,创建和填充一个的最佳方法是什么?从最重要到最不重要的"最佳"被定义:

  • 使用最佳索引创建的表
  • 行生成最快
  • 用于创建和填充的简单代码

如果你不知道数字表是什么,请看这里:我为什么要考虑使用辅助数字表?

sql-server sql-server-2005

62
推荐指数
6
解决办法
9万
查看次数

生成在TSQL中递增日期的结果集

考虑需要创建日期的结果集.我们有开始和结束日期,我们想要生成两者之间的日期列表.

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功能,请标记为.

sql t-sql database sql-server sql-server-2005

53
推荐指数
5
解决办法
5万
查看次数

t-sql获取2个日期之间的所有日期

可能重复:
在一系列日期之间获取日期

假设我有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)

t-sql date

17
推荐指数
3
解决办法
5万
查看次数

有趣的SQL加入日期之间的日期

首先,感谢任何帮我解决这个问题的人.我正在使用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)

我该怎么做呢?我很难过,没有任何谷歌搜索帮助.

sql datetime join sql-server-2005 sql-server-2008

17
推荐指数
1
解决办法
3万
查看次数

为什么(以及如何)使用master..spt_values拆分列?

将问题的答案分解为"一列拆分为多行",我在此重新编写为[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)

相关问题:

sql t-sql sql-server database-design

16
推荐指数
1
解决办法
1万
查看次数

组关闭数字

我有一个包含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.

任何帮助都会很棒

sql sql-server sql-server-2008 gaps-and-islands

11
推荐指数
1
解决办法
369
查看次数

SQL中的整数长度(即十进制字符串的长度)

快速版:以下是最好的,为什么?(或者,还有更好的方法):

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(开始))+ …

sql sql-server sql-server-2005

9
推荐指数
1
解决办法
4万
查看次数

有趣的SQL拼图

如果没有循环或游标,您如何获取日期间隔列表并将它们转换为1和0的字符串,以便:

  • 每个位代表从最小(所有日期)到最大(所有日期)的每一天
  • 如果该日落在任何日期间隔内,则该位为1
  • 如果那天没有落入任何间隔,则该位为0

例如,如果间隔是:

  • 2011年1月1日至2011年1月1日
  • 2011年1月4日至2011年5月5日

然后你编写的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)

sql sql-server puzzle

9
推荐指数
1
解决办法
491
查看次数

根据列值重复N次

我有下表.

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)

sql t-sql repeat sql-server-2008

9
推荐指数
2
解决办法
2万
查看次数