2012-02-02 142 views
3

选择使用每秒:SQL Server 2008 R2的SQL服务器 - 一天

我想编写一个查询,将选择(有序,在单个列)每隔一天的日期时间格式。

Ex。

2012-02-02 00:00:00 
2012-02-02 00:00:01 
2012-02-02 00:00:02 
2012-02-02 00:00:03 
2012-02-02 00:00:04 
... 
2012-02-02 23:59:58 
2012-02-02 23:59:59 

是的,认真的。

如果需要,我可以创建一个数字表,如果我可以将整数值转换为datetime,这可能会有所帮助。

在此先感谢。

+0

我刚刚尝试发布此文件时遇到了四次重新验证码。 PLZ评论,如果你能看到它。 (叹气) – 2012-02-02 22:18:02

+0

你的帖子可以看到! – Akhil 2012-02-02 22:19:27

+0

你可以使用递归,但不幸的是SQL Server中的最大递归计数是100 – Akhil 2012-02-02 22:21:46

回答

6

这假设一个数值表,其值高达86,400 ......一天中的秒数。

为了说明这一点,我在这里创建了一个数字表......但您应该提前做这个。

SET NOCOUNT ON 

DECLARE @YourDate DATETIME 
SET @YourDate = '2/2/2012' 

DECLARE @Numbers TABLE (Number INT) 
DECLARE @Index INT 

SET @Index = 0 
WHILE (@Index < 86400) 
BEGIN 
    INSERT INTO @Numbers VALUES (@Index) 
    SET @Index = @Index + 1 
END 

SELECT DATEADD(SECOND, n.Number, @YourDate) 
FROM @Numbers n 
WHERE n.Number < 86400 
+1

+1以提前创建数字表 – AdaTheDev 2012-02-02 22:32:47

+0

非常简单,它在5秒内运行。尼斯。 – 2012-02-03 14:51:21

2

如果你不想靠另一个表,使用CTE,而可能更多的CPU可能是另一种选择。

;WITH q (TimeOfDay) AS (
    SELECT DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0) 
    UNION ALL 
    SELECT DATEADD(ss, 1, q.TimeOfDay) 
    FROM q 
    WHERE DAY(GETDATE()) = DAY(DATEADD(ss, 1, q.TimeOfDay)) 
) 
SELECT * 
FROM q 
OPTION (MAXRECURSION 0) 
+1

我不知道maxrecurstion可以得到0. * unlimited。)我删除了myne – 2012-02-02 22:44:24

3

如果您不想依赖表或递归CTE,请使用几个交叉连接。如果你的序列需要更多的数字,只需添加更多的交叉连接 - 你可以快速获得几百万的数据。

DECLARE @start_date AS DATETIME = '2012-02-02'; 
WITH L0 AS (SELECT 1 AS C UNION ALL SELECT 1),  --  2 
    L1 AS (SELECT L0.C FROM L0 CROSS JOIN L0 AS B), --  4 
    L2 AS (SELECT L1.C FROM L1 CROSS JOIN L1 AS B), --  16 
    L3 AS (SELECT L2.C FROM L2 CROSS JOIN L2 AS B), -- 256 
    L4 AS (SELECT L3.C FROM L3 CROSS JOIN L3 AS B), -- 65536 
    L5 AS (SELECT L4.C FROM L4 CROSS JOIN L4 AS B), -- Alot 
     N AS (SELECT ROW_NUMBER() OVER(ORDER BY L5.C) AS n FROM L5), 
     D AS (SELECT DATEADD(SECOND, n - 1, @start_date) AS d, n FROM N) 
SELECT d from D where n <= (60 * 60 * 24)