MSSQL查询当日两个日期范围之间的所有记录

时间:2019-08-01 18:03:10

标签: sql sql-server

我可能不会问这个权利,但是基本上我需要一个查询,该查询在运行时返回从当月1日到15日输入的所有记录。而当15个通过时,仅返回从16号到当前月末的记录。

我试图构建类似的东西,但是它是针对bigquery而不是sql的,而对于mssql 2016我似乎找不到类似的东西。

select sample_id
from dbo.table
WHERE date_entered BETWEEN DATE_ADD(CURRENT_DATE(), -15, 'DAY') AND CURRENT_DATE()
or
WHERE date_entered BETWEEN CAST(eomonth(GETDATE()) AS datetime) AND CURRENT_DATE()

无论今天是什么日期,我都需要1日直到今天,直到15日。然后是16号,直到今天,直到月底。抱歉,我是SQL的新手。

更新:我能够使用@GordonLinoff提供的示例解决此问题。谢谢戈登!

SELECT rowguid, ModifiedDate 
FROM [AdventureWorks2017].[Person].[Person]
WHERE Year(ModifiedDate) =Year(getdate()) and month(ModifiedDate) =month(getdate()) and 
((day(getdate()) <= 15 and day(ModifiedDate) <=15))
Or
((day(getdate()) >= 16 and day(ModifiedDate) >=16))

3 个答案:

答案 0 :(得分:0)

对逻辑的描述有点难以理解,但是您似乎想要这样的东西:

where date_entered >= datefromparts(year(getdate(), month(getdate(), 1)) and -- this month
      (day(getdate()) <= 15 or
       day(getdate()) > 15 and day(date_entered) > 15
      )

答案 1 :(得分:0)

这是MySQL:

  SELECT *
  FROM dbo.table
  WHERE date BETWEEN  CASE WHEN DAY(CURRENT_DATE) <= 15 
                           THEN DATE_FORMAT(CURRENT_DATE, '%Y-%m-01')
                           ELSE DATE_FORMAT(CURRENT_DATE, '%Y-%m-16')
                      END 
                AND   CASE WHEN DAY(CURRENT_DATE) <= 15 
                           THEN DATE_FORMAT(CURRENT_DATE, '%Y-%m-15')
                           ELSE LAST_DAY(CURRENT_DATE)
                      END 

大查询:

 SELECT *
 FROM table
 WHERE date BETWEEN  CASE WHEN EXTRACT(DAY FROM CURRENT_DATE) <= 15 
                          THEN DATE_TRUNC(CURRENT_DATE, MONTH)
                          ELSE DATE_ADD(DATE_TRUNC(CURRENT_DATE, MONTH), INTERVAL 15 DAY) 
                     END 
               AND   CASE WHEN EXTRACT(DAY FROM CURRENT_DATE) <= 15 
                          THEN DATE_ADD(DATE_TRUNC(CURRENT_DATE, MONTH), INTERVAL 14 DAY) 
                          ELSE DATE_ADD(CURRENT_DATE, INTERVAL 31 DAY) 
                     END 

这应该给

    date between 1 and 15
or  date between 16 and last_of_the_month

答案 2 :(得分:0)

  

我尝试构建类似这样的东西,但它适用于bigquery

无论使用哪种示例-BigQuery都无法使用!

以下是BigQuery Standard SQL的有效示例,并使用一些“技巧”来避免使用冗余代码片段

#standardSQL
SELECT sample_id
FROM `project.dataset.table`, 
UNNEST([STRUCT(
  EXTRACT(DAY FROM date_entered) AS day, 
  DATE_TRUNC(date_entered, MONTH) AS month
)])  
WHERE DATE_TRUNC(CURRENT_DATE(), MONTH) = month 
AND IF(
    EXTRACT(DAY FROM CURRENT_DATE()) < 16, 
    day BETWEEN 1 AND 15,
    day BETWEEN 16 AND 99
  )