2017-04-12 4 views
1

ich jede eine Abfrage in SQL Server schreibt alle Aufträge anzuzeigen, die in der vergangenen Woche empfangen wurden, die Abfrage der Grundlage eines automatisierten Bericht in Crystal Report wird, Syntax ist wie untenAusgabe mit einer WHERE-Klausel

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 

Wenn die Abfrage ausgeführt wird erhalte ich einen Fehler

Wert auf ein ‚Datum‘ -Spalte Zugabe verursachte einen Überlauf

Kann jemand sehen, was ich falsch mache?

+2

bitte einfügen genaue Fehlermeldung und einige Beispieldaten für diese beteiligten Tabellen – TheGameiswar

+1

Warum sind die besten 100%? –

+0

Ich nehme an, dass Sie sehr frühe Daten in Ihrer Tabelle haben? Wenn Sie diese SELECT DATEADD ausführen (WK, -1, '17530101'); dann erhalten Sie den gleichen Fehler, und dies liegt daran, dass SQL Server keine Daten vor einem Abschaltpunkt behandelt. –

Antwort

0

Der einzige Ort, an dem Ihr Fehler aus dem bereitgestellten Code stammen könnte, ist: dateadd(week, -1, j.job_taken_date), der sowohl in Ihrem select als auch in Ihrem where erscheint.

Sie können dies umgehen, indem datepart() mit der week ganzen Zahl zu erhalten und zu reduzieren, dass um 1 statt mit dem date Wert der Einstellung: convert(varchar(2),datepart(week,j.job_taken_date)-1).

Es sieht aus wie Ihre where Klausel bedeutet "Jobs in dieser Woche genommen". Wenn dies der Fall ist, können Sie Ihre where vereinfachen, um Daten zu vergleichen, die auf die Woche verkürzt sind, anstatt den Zeichenfolgenvergleich, den Sie gerade erstellen, was möglicherweise Ihren Fehler verursacht.

Sie können Ihre Abfrage auch einfacher lesen, indem Sie Tabellenaliase verwenden und keine Kurzschrift mit Datums-/Uhrzeitoperationen verwenden.

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 
+0

Sie müssen ein wenig vorsichtig sein, wenn Sie eine Jahresgrenze, z. Diese beiden Abfragen sind nicht äquivalent: SELECT DATEPART (WOCHE, DATUMADD (WOCHE, -1, '20170101')); SELECT DATEPART (WOCHE, '20170101') - 1; –

+0

@RichardHansell Das ist ein guter Punkt. – SqlZim