2013-08-20 68 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中)

相关问题