Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从datetime列创建两列_Sql Server_Datetime - Fatal编程技术网

Sql server 从datetime列创建两列

Sql server 从datetime列创建两列,sql-server,datetime,Sql Server,Datetime,所以我有一个关于从datetime列创建两列的问题 我的例子 CREATE TABLE #Test (ID int, OK bit, Data datetime) INSERT INTO #Test VALUES (1,0,'Dec 1 2015 12:00AM') INSERT INTO #Test VALUES (2,1,'Dec 2 2015 12:00AM') INSERT INTO #Test VALUES (3,1,'Dec 3 2015 12:00AM') INSERT

所以我有一个关于从datetime列创建两列的问题

我的例子

  CREATE TABLE #Test (ID int, OK bit, Data datetime)
INSERT INTO #Test VALUES (1,0,'Dec  1 2015 12:00AM')
INSERT INTO #Test VALUES (2,1,'Dec  2 2015 12:00AM')
INSERT INTO #Test VALUES (3,1,'Dec  3 2015 12:00AM')
INSERT INTO #Test VALUES (4,1,'Dec  4 2015 12:00AM')
INSERT INTO #Test VALUES (5,0,'Dec  5 2015 12:00AM')
INSERT INTO #Test VALUES (6,0,'Dec  6 2015 12:00AM')
INSERT INTO #Test VALUES (7,1,'Dec  7 2015 12:00AM')
INSERT INTO #Test VALUES (8,1,'Dec  8 2015 12:00AM')
INSERT INTO #Test VALUES (9,1,'Dec  9 2015 12:00AM')
INSERT INTO #Test VALUES (10,1,'Dec 10 2015 12:00AM')
INSERT INTO #Test VALUES (11,1,'Dec 11 2015 12:00AM')
INSERT INTO #Test VALUES (12,0,'Dec 12 2015 12:00AM')
INSERT INTO #Test VALUES (13,0,'Dec 13 2015 12:00AM')
INSERT INTO #Test VALUES (14,1,'Dec 14 2015 12:00AM')
INSERT INTO #Test VALUES (15,1,'Dec 15 2015 12:00AM')
INSERT INTO #Test VALUES (16,1,'Dec 16 2015 12:00AM')
INSERT INTO #Test VALUES (17,1,'Dec 17 2015 12:00AM')
INSERT INTO #Test VALUES (18,1,'Dec 18 2015 12:00AM')
INSERT INTO #Test VALUES (19,0,'Dec 19 2015 12:00AM')
INSERT INTO #Test VALUES (20,0,'Dec 20 2015 12:00AM')
INSERT INTO #Test VALUES (21,1,'Dec 21 2015 12:00AM')
INSERT INTO #Test VALUES (22,1,'Dec 22 2015 12:00AM')
INSERT INTO #Test VALUES (23,1,'Dec 23 2015 12:00AM')
INSERT INTO #Test VALUES (24,1,'Dec 24 2015 12:00AM')
INSERT INTO #Test VALUES (25,0,'Dec 25 2015 12:00AM')
INSERT INTO #Test VALUES (26,0,'Dec 26 2015 12:00AM')
INSERT INTO #Test VALUES (27,0,'Dec 27 2015 12:00AM')
INSERT INTO #Test VALUES (28,1,'Dec 28 2015 12:00AM')
INSERT INTO #Test VALUES (29,1,'Dec 29 2015 12:00AM')
INSERT INTO #Test VALUES (30,1,'Dec 30 2015 12:00AM')
这将产生以下结果

ID  OK  Data
--------------------
1   0   2015-12-01 00:00:00.000
2   1   2015-12-02 00:00:00.000
3   1   2015-12-03 00:00:00.000
4   1   2015-12-04 00:00:00.000
5   0   2015-12-05 00:00:00.000
6   0   2015-12-06 00:00:00.000
7   1   2015-12-07 00:00:00.000
8   1   2015-12-08 00:00:00.000
9   1   2015-12-09 00:00:00.000
10  1   2015-12-10 00:00:00.000
11  1   2015-12-11 00:00:00.000
12  0   2015-12-12 00:00:00.000
13  0   2015-12-13 00:00:00.000
14  1   2015-12-14 00:00:00.000
15  1   2015-12-15 00:00:00.000
16  1   2015-12-16 00:00:00.000
17  1   2015-12-17 00:00:00.000
18  1   2015-12-18 00:00:00.000
19  0   2015-12-19 00:00:00.000
20  0   2015-12-20 00:00:00.000
21  1   2015-12-21 00:00:00.000
22  1   2015-12-22 00:00:00.000
23  1   2015-12-23 00:00:00.000
24  1   2015-12-24 00:00:00.000
25  0   2015-12-25 00:00:00.000
26  0   2015-12-26 00:00:00.000
27  0   2015-12-27 00:00:00.000
28  1   2015-12-28 00:00:00.000
29  1   2015-12-29 00:00:00.000
30  1   2015-12-30 00:00:00.000
所以我的问题是,如何在不使用游标或while的情况下创建一个两列表

输出应该是。我知道我可以通过使用光标来实现这一点,但这必须是一种更简单的方法。有什么帮助吗

    StartDate                 EndDate
    -----------------------   -----------------------
    2015-12-02 00:00:00.000 - 2015-12-04 00:00:00.000
    2015-12-07 00:00:00.000 - 2015-12-11 00:00:00.000
    2015-12-14 00:00:00.000 - 2015-12-18 00:00:00.000
    2015-12-21 00:00:00.000 - 2015-12-24 00:00:00.000
    2015-12-28 00:00:00.000 - 2015-12-30 00:00:00.000

您可以使用以下查询:

SELECT MIN(Data) AS StartDate,
       MAX(Data) AS EndDate
FROM (
  SELECT ID, OK, Data,
         DATEADD(d, -1 * ROW_NUMBER() OVER 
                         (PARTITION BY OK ORDER BY ID), Data) AS grp
  FROM Test) AS t
WHERE OK = 1
GROUP BY grp
查询使用计算字段
grp
来识别具有相同
OK
切片的连续日期的连续记录的孤岛


您可以使用以下查询:

SELECT MIN(Data) AS StartDate,
       MAX(Data) AS EndDate
FROM (
  SELECT ID, OK, Data,
         DATEADD(d, -1 * ROW_NUMBER() OVER 
                         (PARTITION BY OK ORDER BY ID), Data) AS grp
  FROM Test) AS t
WHERE OK = 1
GROUP BY grp
查询使用计算字段
grp
来识别具有相同
OK
切片的连续日期的连续记录的孤岛


您的问题是如何使用查询,因为当您说“创建一个两列表”时,您可以直接这样做,而不是只创建一个表?如果是一个查询,那么使用的逻辑是什么?是的,我想在查询中这样做。你的问题是如何在查询中这样做,因为当你说“创建一个两列表”时,你可以直接这样做,而不是单列表?如果是一个查询-使用了什么逻辑?是的,我想在查询中这样做。谢谢!这就是我要找的。谢谢!这就是我一直在寻找的。