2016-12-20 2 views
0

Ich habe einen Bericht, der eine Abfrage hat, die automatisierte muss, so dass der Datenbereich ist halb monatlich zurück (1 - 15) (16 - Monatsende)BigQuery SQL Halbmonatsdatumsbereich

Also, wenn die Der Bericht wird am 1. des Monats ausgeführt, der Datumsbereich ist für die vorherigen Monate 16. - Ende des vorherigen Monats.

Wenn der Bericht am 15. ausgeführt wird, gilt der Bereich für den aktuellen Monat 1. - 15..

Ich plane, ein zwischen zu verwenden. aber ich muss in der Lage sein, die Daten für date_from und date_to dynamisch zu generieren.

Ist so etwas möglich (vielleicht mit dem aktuellen Datum und einige Berechnungen)?

Hilfe wird sehr geschätzt.

Eric

Antwort

1

Um einen Datumsbereich zu erzeugen, können Sie die GENERATE_DATE_ARRAY function verwenden. Zum Beispiel

SELECT d 
FROM UNNEST(GENERATE_DATE_ARRAY(
       CURRENT_DATE(), 
       DATE_ADD(CURRENT_DATE(), INTERVAL 14 DAY))) AS d; 

Beachten Sie, dass diese Funktion ist nur in standard SQL.

Um einen Bereich von den ersten des laufenden Monat bis zum 15. zu erzeugen, können Sie die DATE_TRUNC Funktion:

SELECT d 
FROM UNNEST(GENERATE_DATE_ARRAY(
       DATE_TRUNC(CURRENT_DATE(), MONTH), 
       DATE_ADD(DATE_TRUNC(CURRENT_DATE(), MONTH), INTERVAL 15 DAY))) AS d; 
1

Sie sollen dies aus Ihrer Datenbank mit einer Funktion der Lage sein, leicht zu erreichen, wie zum Beispiel IF(), DATE_SUB() und DATE_FORMAT(). Hier ist ein Beispiel dafür verwendet, die in Ihrem Beispiel funktionieren könnte:

SELECT * 
FROM 
mytable 
WHERE 
mydate >= IF(DAY(NOW()) >= 15, 
DATE_FORMAT(NOW(), '%Y-%m-01'), 
DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH)), '%Y-%m-16') 
&& mydate <= IF(DAY(NOW()) >= 15, 
DATE_FORMAT(NOW(), '%Y-%m-15'), 
LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH))) 

* Dieses Beispiel ist MySQL

0
DECLARE @FIRST_DAY_OF_CURRENT_MONTH DATE 

DECLARE @FIRST_DAY_OF_PRIOR_MONTH DATE 

DECLARE @LAST_DAY_OF_PRIOR_MONTH DATE 

SET @FIRST_DAY_OF_CURRENT_MONTH =DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0) 

SET @FIRST_DAY_OF_PRIOR_MONTH =DATEADD(MM,-1,@FIRST_DAY_OF_CURRENT_MONTH) 

SET @LAST_DAY_OF_PRIOR_MONTH =DATEADD(MM,DATEDIFF(MM,0,GETDATE()),-1) 

IF (DATEPART(DD,GETDATE()) =15) 

BEGIN 

SELECT * FROM TABLE 

WHERE DATE_COLUMN BETWEEN @FIRST_DAY_OF_CURRENT_MONTH AND 

DATEADD(DD,14,@FIRST_DAY_OF_CURRENT_MONTH) 

END 

IF(DATEPART(DD,GETDATE()) = 1) 

SELECT * FROM TABLE 

WHERE DATE_COLUMN BETWEEN DATEADD(DD,15,@FIRST_DAY_OF_PRIOR_MONTH) AND @LAST_DAY_OF_PRIOR_MONTH 

END