2012-02-02 143 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)