2013-08-20 226 views
0

今天是2013年8月20日。 我想通過使用查詢來生成20行,其中將包含日期從1日到20日(無論是當前日期)。 計數應始終從本月1日開始日期和直到當前的日期......輸出會是什麼樣子,只有一列,多行,直到當前的日期就像下面給出..選擇日期到當前日期 - mysql

Current month 
    8/1/13 12:00 AM 
    8/2/13 12:00 AM 
    8/3/13 12:00 AM 
    8/4/13 12:00 AM 
    8/5/13 12:00 AM 
    8/6/13 12:00 AM 
    8/7/13 12:00 AM 
    8/8/13 12:00 AM 
    8/9/13 12:00 AM 
    8/10/13 12:00 AM 
    8/11/13 12:00 AM 
    8/12/13 12:00 AM 
    8/13/13 12:00 AM 
    8/14/13 12:00 AM 
    8/15/13 12:00 AM 
    8/16/13 12:00 AM 
    8/17/13 12:00 AM 
    8/18/13 12:00 AM 
    8/19/13 12:00 AM 
    8/20/13 12:00 AM 

我嘗試下面的查詢,但沒用的。你能幫忙找到一些解決方法嗎?

DECLARE @startDate DATETIME=CAST(MONTH(GETDATE()) AS VARCHAR) + '/' + '01/' + + CAST(YEAR(GETDATE()) AS VARCHAR) -- mm/dd/yyyy 
DECLARE @endDate DATETIME= GETDATE() -- mm/dd/yyyy 

;WITH Calender AS 
(
    SELECT @startDate AS CalanderDate 
    UNION ALL 
    SELECT CalanderDate + 1 FROM Calender 
    WHERE CalanderDate + 1 <= @endDate 
) 
SELECT [Date] = CONVERT(VARCHAR(10),CalanderDate,25) 
FROM Calender 
OPTION (MAXRECURSION 0) 
+2

你爲什麼使用MySQL? – Strawberry

回答

2

這也可以通過動態構建所有日子的結果集來工作,但可以針對任何現有的表具有至少31天(任意給定月份的最大值)。

select 
     @curDay := date_add(@curDay, interval 1 day) as CalendarDay 
    from 
     (select @curDay := date_add(DATE_FORMAT(NOW(), 
     '%Y-%m-01'), interval -1 day)) sqlvars, 
     AnyTableInYourDatabaseWithAtLeast31Records 
    where 
     @curDay <= now() 
    limit 
     31 

選擇@curDay的第一部分建立任何當前日期是,得到的第一個月,然後減去距其1天給你上月的最後一天。然後,外部select @curDay:=通過將CalendarDay結果列添加1天來不斷更新自身。由於它加入數據庫中的「任何表」,它將繼續抓取31條記錄的最大值,但只返回日期小於或當前的位置。

0

小提琴在

http://www.sqlfiddle.com/#!2/28466/1

CREATE TABLE CALENDAR(DATE1 DATETIME); 

INSERT INTO CALENDAR VALUES ('2013/8/1 12:00:00'); 
INSERT INTO CALENDAR VALUES ('2013/8/2 12:00:00'); 
INSERT INTO CALENDAR VALUES ('2013/8/3 12:00:00'); 
INSERT INTO CALENDAR VALUES ('2013/8/4 12:00:00');.... 

SELECT DISTINCT DATE1 FROM Calender where MONTH(DATE1)=MONTH(NOW()) and DAYOFMONTH(DATE1) <=DAYOFMONTH(NOW()) 

這使輸出

0

我喜歡用符合表對這些各種各樣的問題,他們往往是相當快:

DECLARE @startDate DATETIME= CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(GETDATE())-1),GETDATE()),101); 
WITH 
N0 as (SELECT 1 as n UNION ALL SELECT 1) 
,N1 as (SELECT 1 as n FROM N0 AS t1 CROSS JOIN N0 AS t2) 
,N2 as (SELECT 1 as n FROM N1 AS t1 CROSS JOIN N1 AS t2) 
,N3 as (SELECT 1 as n FROM N2 AS t1 CROSS JOIN N2 AS t2) 
,N4 as (SELECT 1 as n FROM N3 AS t1 CROSS JOIN N3 AS t2) 
,N5 as (SELECT 1 as n FROM N4 AS t1 CROSS JOIN N4 AS t2) 
,N6 as (SELECT 1 as n FROM N5 AS t1 CROSS JOIN N5 AS t2) 
,nums as (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as num FROM N6) 
SELECT DATEADD(day,num-1,@startDate) as theDate 
FROM nums 
WHERE num <= DATEDIFF(day,@startDate,GETDATE()) + 1 
0

你可以嘗試調用這個存儲過程;

DELIMITER $$ 

    CREATE PROCEDURE `test`.`GenerateDates`() 

BEGIN 
    DECLARE Days INTEGER; 
    DECLARE Count INTEGER; 

    SET Days = DATEDIFF(NOW(),CONCAT(YEAR(NOW()),'-',MONTH(NOW()),'-01')); 
    SET Count = 0; 

    DROP TEMPORARY TABLE IF EXISTS tempDates; 
    CREATE TEMPORARY TABLE tempDates 
     (
      YourDate Date, 
      PRIMARY KEY(YourDate) 
     ); 


    WHILE (Count <= Days) DO 
     INSERT INTO tempDates (YourDate) VALUES 
     (DATE_FORMAT(DATE_ADD(CONCAT(YEAR(NOW()),'-',MONTH(NOW()),'-01'), INTERVAL Count DAY),'%Y-%m-%d')); 
     SET Count = Count + 1; 
    END WHILE; 

    SELECT * FROM tempDates; 
END 
0

:) ...或者,如果31個整數的表似乎是一個舒展,怎麼樣的10桌...

SELECT * FROM ints; 
+---+ 
| i | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

SELECT DATE_FORMAT(CURDATE(),'%Y-%m-01')+INTERVAL i2.i*10+i1.i DAY x FROM ints i1, ints i2 HAVING x <= NOW(); 
+------------+ 
| x   | 
+------------+ 
| 2013-08-01 | 
| 2013-08-02 | 
| 2013-08-03 | 
| 2013-08-04 | 
| 2013-08-05 | 
| 2013-08-06 | 
| 2013-08-07 | 
| 2013-08-08 | 
| 2013-08-09 | 
| 2013-08-10 | 
| 2013-08-11 | 
| 2013-08-12 | 
| 2013-08-13 | 
| 2013-08-14 | 
| 2013-08-15 | 
| 2013-08-16 | 
| 2013-08-17 | 
| 2013-08-18 | 
| 2013-08-19 | 
| 2013-08-20 | 
+------------+ 

(仍然不知道你爲什麼會做這個在MySQL中)

相關問題