Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 server 用WHERE子句发出_Sql Server - Fatal编程技术网

Sql server 用WHERE子句发出

Sql server 用WHERE子句发出,sql-server,Sql Server,我在SQL Server中编写任何查询以显示前一周收到的所有作业,该查询将作为Crystal report中自动报告的基础,语法如下所示 SELECT TOP (100) PERCENT DATENAME(yy, dbo.JOB.JOB_TAKEN_DATE) + '-' + DATENAME(wk, DATEADD(wk, - 1, dbo.JOB.JOB_TAKEN_DATE)) AS PERIOD, dbo.JOB.CUST_ORD_NO AS [ORDER NO],

我在SQL Server中编写任何查询以显示前一周收到的所有作业,该查询将作为Crystal report中自动报告的基础,语法如下所示

SELECT TOP (100) PERCENT 
    DATENAME(yy, dbo.JOB.JOB_TAKEN_DATE) + '-' + DATENAME(wk, DATEADD(wk, - 1, dbo.JOB.JOB_TAKEN_DATE)) AS PERIOD,
    dbo.JOB.CUST_ORD_NO AS [ORDER NO],
    dbo.JOB.JOB_TAKEN_DATE AS RECEIVED,
    dbo.JOB.JOB_COMPLETION_DATE AS COMPLETED,
    UPPER(ISNULL(dbo.JOB.PROPERTY_LOCATION, ' ') + ' ' + dbo.JOB.PROPERTY_NAME + ' ' + REPLACE(REPLACE(REPLACE(dbo.JOB.PROPERTY_ADDRESS, CHAR(10), ' '), CHAR(13), ' '), CHAR(9), ' ') + ' ' + dbo.JOB.PROPERTY_POSTCODE) AS ADDRESS,
    REPLACE(REPLACE(REPLACE(dbo.JOB.WORKS_TO_BE_CARRIED_OUT, CHAR(10), ' '), CHAR(13), ' '), CHAR(9), ' ') AS [WORKS ORDERED],
    dbo.JOB.JOB_TARGET_DATE,
    dbo.['TMO properties$'].F2 
FROM
    dbo.JOB 
INNER JOIN 
    dbo.CUSTOMERPROPERTY ON dbo.JOB.CUSTOMER_PROPERTY_ID = dbo.CUSTOMERPROPERTY.CUSTOMER_PROPERTY_ID 
INNER JOIN 
    dbo.['TMO properties$'] ON dbo.CUSTOMERPROPERTY.EXTERNAL_REFERENCE = dbo.['TMO properties$'].F1 
WHERE
    DATENAME(yy, dbo.JOB.JOB_TAKEN_DATE) + '-' + DATENAME(wk, DATEADD(wk, - 1, dbo.JOB.JOB_TAKEN_DATE)) = DATENAME(yy, CURRENT_TIMESTAMP) + '-' + DATENAME(wk, DATEADD(wk, - 1, CURRENT_TIMESTAMP)) 
ORDER BY
    RECEIVED
运行查询时,我得到一个错误

向“日期”列添加值导致溢出


有人能看出我做错了什么吗?

在提供的代码中,您的错误可能来自的唯一地方是:
dateadd(week,-1,j.job\u take\u date)
,它出现在您的
select
where

您可以通过使用
datepart()
获取
week
整数并将其减少1,而不是通过以下方式调整
date
值:
convert(varchar(2),datepart(week,j.job\u take\u date)-1)

看起来你的
where
子句的意思是“本周接受的工作”。如果是这种情况,您可以简化
where
,将截断的日期与一周进行比较,而不是现在构建的字符串比较,这可能会导致错误

您还可以使用表别名,而不使用日期/时间操作的速记,从而使查询更易于阅读

select top (100) percent 
    datename(year, j.job_taken_date) 
    + '-' 
    --+ datename(week, dateadd(week, -1, j.job_taken_date)
    + convert(varchar(2),datepart(week,j.job_taken_date)-1)
    ) as period
  , j.cust_ord_no as [order no]
  , j.job_taken_date as received
  , j.job_completion_date as completed
  , upper(isnull(j.property_location, ' ') 
    + ' ' + j.property_name + ' ' 
    + replace(replace(replace(j.property_address, char(10), ' '), char(13), ' '), char(9), ' ') 
    + ' ' + j.property_postcode
    ) as address
  , replace(replace(replace(j.works_to_be_carried_out, char(10), ' '), char(13), ' '), char(9), ' '
    ) as [works ordered]
  , j.job_target_date
  , tmop.F2
from dbo.job j
  inner join dbo.customerproperty cp
    on j.customer_property_id = cp.customer_property_id
  inner join dbo.['tmo properties$'] tmop
    on cp.external_reference = tmop.F1
where dateadd(week, datediff(week, 0, j.job_taken_date), 0)
    = dateadd(week, datediff(week, 0, current_timestamp), 0)
order by received

您的错误可能来自提供的代码中的唯一位置是:
dateadd(week,-1,j.job\u taked\u date)
,它出现在您的
select
where

您可以通过使用
datepart()
获取
week
整数并将其减少1,而不是通过以下方式调整
date
值:
convert(varchar(2),datepart(week,j.job\u take\u date)-1)

看起来你的
where
子句的意思是“本周接受的工作”。如果是这种情况,您可以简化
where
,将截断的日期与一周进行比较,而不是现在构建的字符串比较,这可能会导致错误

您还可以使用表别名,而不使用日期/时间操作的速记,从而使查询更易于阅读

select top (100) percent 
    datename(year, j.job_taken_date) 
    + '-' 
    --+ datename(week, dateadd(week, -1, j.job_taken_date)
    + convert(varchar(2),datepart(week,j.job_taken_date)-1)
    ) as period
  , j.cust_ord_no as [order no]
  , j.job_taken_date as received
  , j.job_completion_date as completed
  , upper(isnull(j.property_location, ' ') 
    + ' ' + j.property_name + ' ' 
    + replace(replace(replace(j.property_address, char(10), ' '), char(13), ' '), char(9), ' ') 
    + ' ' + j.property_postcode
    ) as address
  , replace(replace(replace(j.works_to_be_carried_out, char(10), ' '), char(13), ' '), char(9), ' '
    ) as [works ordered]
  , j.job_target_date
  , tmop.F2
from dbo.job j
  inner join dbo.customerproperty cp
    on j.customer_property_id = cp.customer_property_id
  inner join dbo.['tmo properties$'] tmop
    on cp.external_reference = tmop.F1
where dateadd(week, datediff(week, 0, j.job_taken_date), 0)
    = dateadd(week, datediff(week, 0, current_timestamp), 0)
order by received

请为涉及的表粘贴准确的错误消息和一些示例数据为什么选择前100%?我猜您的表中有一些非常早的日期?如果运行此命令,请选择DATEADD(WK,-1,'17530101');然后您会得到相同的错误,这是因为SQL Server不处理截止点之前的日期。感谢您的回复,但我在数据表中拥有的最早日期是2013。@user3007679作业日期的数据类型是什么??请粘贴准确的错误消息和涉及这些表的一些示例数据为什么选择前100%?我猜您的表中有一些非常早的日期?如果运行此命令,请选择DATEADD(WK,-1,'17530101');然后您会得到相同的错误,这是因为SQL Server不处理截止点之前的日期。感谢您的回复,但我在数据表中拥有的最早日期是2013。@user3007679作业日期的数据类型是什么??当您到达年份边界时,需要稍微小心,例如,这两个查询并不等价:选择DATEPART(WEEK,DATEADD(WEEK,-1,'20170101'));选择DATEPART(周,'20170101')-1;当您遇到年份边界时,您需要稍微小心,例如,这两个查询不是等价的:选择DATEPART(WEEK,DATEADD(WEEK,-1,'20170101');选择DATEPART(周,'20170101')-1;