我的报告有一个需要自动化的查询,以便返回的数据范围是半月(1 - 15)(16 - 月底)
因此,如果报告在该月的第一天运行,则日期范围是前一个月的第16个月 - 上个月的结束。
如果报告在15日运行,则范围是当前月1日 - 15日。
我打算用两者之间。但我需要能够动态生成date_from和date_to范围的日期。
这样的事情是否可能(可能使用当前日期和一些计算)?
非常感谢帮助。
埃里克
答案 0 :(得分:1)
要生成一系列日期,您可以使用GENERATE_DATE_ARRAY
function。例如,
SELECT d
FROM UNNEST(GENERATE_DATE_ARRAY(
CURRENT_DATE(),
DATE_ADD(CURRENT_DATE(), INTERVAL 14 DAY))) AS d;
请注意,此功能仅在standard SQL。
中可用要生成从当月的第一个到第15个的范围,您可以使用DATE_TRUNC
函数:
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 :(得分:1)
您应该可以使用数据库中的函数轻松完成此操作,例如IF(),DATE_SUB()和DATE_FORMAT()。以下是使用可以在您的示例中使用的示例:
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)) )
*这个例子是MySQL
答案 2 :(得分: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