2013-08-20 3 views
0

Сегодня 20 августа 2013 года. Я хочу сгенерировать 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: = продолжает обновлять себя, добавляя 1 день в качестве столбца результата CalendarDay. Начиная с его присоединения к «любой таблице» в вашей базе данных, он будет продолжать захватывать MAX из 31 записи, но возвращаться туда, где дата меньше или текущая.

0

Fiddle в

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)

Смежные вопросы