我的报告具有需要自动化的查询,以便返回的数据范围是半月(1-15)(16--月末)
因此,如果报告是在月1日运行的,则日期范围是前16-上月末的月份。
如果报告在15日运行,则该范围是本月1-15。
我打算在两者之间使用。但是我需要能够动态生成date_from和date_to range的日期。
可能会这样(也许使用当前日期和一些计算)?
非常感谢。
eric
要生成一系列日期,您可以使用GENERATE_DATE_ARRAY
函数。例如,
SELECT d
FROM UNNEST(GENERATE_DATE_ARRAY(
CURRENT_DATE(),
DATE_ADD(CURRENT_DATE(), INTERVAL 14 DAY))) AS d;
请注意,此功能仅在标准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;
您应该能够通过数据库中的功能轻松完成此操作,例如(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
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