Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于日期和月份检索用户的SQL查询_Sql_Sql Server_Tsql_Date_Datetime - Fatal编程技术网

基于日期和月份检索用户的SQL查询

基于日期和月份检索用户的SQL查询,sql,sql-server,tsql,date,datetime,Sql,Sql Server,Tsql,Date,Datetime,我有下表: 用户 用户ID 公司ID 名字 活跃的 加入日期 离开的日期 我正在尝试获取一个查询以获取付费用户,条件是: 加入计费月份的用户不被视为可计费用户 在计费月份离开的用户是可计费用户 我有以下疑问: SELECT * from user u WHERE CompanyID = 1205 AND (p.IsActive = 1 AND MONTH(p.Date_Joined) != MONTH(GETDATE()) OR (p.is_active = 0 AND MONTH(p.

我有下表:

用户

  • 用户ID
  • 公司ID
  • 名字
  • 活跃的
  • 加入日期
  • 离开的日期
我正在尝试获取一个查询以获取付费用户,条件是:

  • 加入计费月份的用户不被视为可计费用户
  • 在计费月份离开的用户是可计费用户
我有以下疑问:

SELECT * from user u WHERE CompanyID = 1205
AND (p.IsActive = 1 AND MONTH(p.Date_Joined) != MONTH(GETDATE())
OR (p.is_active = 0 AND MONTH(p.Date_Left) = MONTH(GETDATE())
问题在于,该查询不起作用,因为它没有检查用户的年份(2017年9月加入的用户不应被视为可付费用户,即使他们应该在2017年加入,而不是今年加入,2018年9月创建的用户不应被视为可付费用户)

如何实施年度计划或优化查询?

  • 我想你的括号错了。把它们放在
    周围没有任何作用。您可能想把它们放在
    周围
  • 别名
    p
    没有目标表。从列名来看,我认为以它为前缀的列也是来自
    user
    ,因此将别名更改为
    u
  • 要查看年份,您可以使用与使用月份类似的
    year()

你可以这样用

SELECT * from user u WHERE CompanyID = 1205
AND (p.IsActive = 1 AND CONCAT(YEAR(p.Date_Joined),'/',MONTH(p.Date_Joined)) != CONCAT(YEAR(GETDATE()),'/',MONTH(GETDATE())))
OR (p.is_active = 0 AND CONCAT(YEAR(p.Date_Left),'/',MONTH(p.Date_Left)) = CONCAT(YEAR(GETDATE()),'/',MONTH(GETDATE())))
可用于确定月份的最后一天。例如:

/* last day of prev month */ EOMONTH('2018-09-05', -1) = 2018-08-31
/* last day of curr month */ EOMONTH('2018-09-05')     = 2018-09-30
您可以轻松检查活动用户是在上个月加入的,还是非活动用户在本月离开的,如下所示:

DECLARE @billdate AS DATE = '2018-09-05';

SELECT * 
FROM user
WHERE CompanyID = 1205 AND (
    (
        IsActive = 1 AND 
        Date_Joined <= EOMONTH(@billdate, -1)
    )
    OR
    (
        IsActive = 0 AND 
        Date_Left >  EOMONTH(@billdate, -1) AND
        Date_Left <= EOMONTH(@billdate)
    )
)
宣布@billdate为日期='2018-09-05';
选择*
来自用户
其中CompanyID=1205,且(
(
IsActive=1和
月日(@billdate,-1)和

日期\左我想您需要检查当前月份的开始日期和结束日期。 试试这个


谢谢您的查询,但是如果我在我的表中启动此功能,我将无法获取本月离开的人员(因此仍然需要付费)。如果该人员在
GETDATE()月离开
,它需要计费谢谢这看起来不错,但我想知道如何测试它以模拟不同的开票月份,我是否增加
-1
以模拟以后的月份?
-1
不应被触摸。替换
GETDATE()
使用用户变量,例如
将@billdate声明为DATE='2018-01-01';
并替换
GETDATE()的所有实例
使用
@billdate
。太好了!这看起来已经很完美了!问题是,即使使用
WHERE CompanyID=1205
-子句,我也会从其他公司获得用户,这是否意味着我需要为每个子句添加
和CompanyID=1205
条件应该用括号括起来。现在这是一个问题
CompanyID=1205和条件1或条件2
。它应该是
CompanyID…和(条件1或条件2)
DECLARE @billdate AS DATE = '2018-09-05';

SELECT * 
FROM user
WHERE CompanyID = 1205 AND (
    (
        IsActive = 1 AND 
        Date_Joined <= EOMONTH(@billdate, -1)
    )
    OR
    (
        IsActive = 0 AND 
        Date_Left >  EOMONTH(@billdate, -1) AND
        Date_Left <= EOMONTH(@billdate)
    )
)
DECLARE @D_FROM_DATE DATE,@D_TO_DATE DATE

SELECT @D_FROM_DATE=DATEADD(DAY,-DATEPART(DAY,GETDATE()-1),GETDATE()),
@D_TO_DATE=DATEADD(MONTH,1,DATEADD(DAY,-DATEPART(DAY,GETDATE()),GETDATE()))

    SELECT * FROM USER P
    WHERE P.COMPANYID = 1205
    AND 
    (
        CAST(P.DATE_JOINED AS DATE) BETWEEN  @D_FROM_DATE AND @D_TO_DATE
        OR 
        CAST(P.DATE_LEFT AS DATE) BETWEEN  @D_FROM_DATE AND @D_TO_DATE
    )