Mam zapytanie SQL napisane przez kolegę, którego już nie ma. Kwerenda działa jako część pracy SSIS, a od tego miesiąca rozpoczęła się niepowodzeniem z powodu następującego błędu:SQL - Date Query Issue - konwersja varchar do datetime spowodowała przekroczenie zakresu wartości
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
Samo zapytanie jest po prostu podstawowy wybrać z warunkiem WHERE który szuka wartości w określonym czasie Range (zakres dat pomiędzy @startdate
i @enddate
)
Kod określić zakres czasu jest poniżej:
DECLARE @RunDateTime datetime
DECLARE @RunDate datetime
DECLARE @StartDate datetime
DECLARE @EndDate datetime
DECLARE @Month int
DECLARE @Year int
DECLARE @strStartDate varchar(10)
SET @RunDateTime = GetDate()
SET @RunDate = cast(round(convert(real, @RunDateTime),0,1) as datetime)
IF DATEPART(d, @RunDate) = 16
BEGIN
SET @StartDate = DATEADD(d, -15, @RunDate)
SET @EndDate = @RunDate
END
ELSE
BEGIN
IF Month(@RunDate) = 1
SET @Month = 12
ELSE
SET @Month = Month(@RunDate) - 1
IF Month(@RunDate) = 1
SET @Year = Year(@RunDate) - 1
ELSE
SET @Year = Year(@RunDate)
SET @strStartDate = CONVERT(varchar(2), @Month)+ '/16/' + CONVERT(varchar(4), @Year)
SET @StartDate = CONVERT(datetime, @strStartDate, 101)
SET @EndDate = @RunDate
END
Ta praca przebiega dwa razy w miesiącu. Raz na 16 na dane od 1 do 15 dnia miesiąca, a raz na 1 na następny miesiąc dla danych od 16 do końca poprzedniego miesiąca.
Z tego, co mogę znaleźć w sieci, najprawdopodobniej winien korzystać z varchar
dla strStartDate
? Nie jestem wystarczająco zaznajomiony z SQL, aby wiedzieć, jak zastąpić wszystko, co się tam dzieje? Czy istnieje lepszy sposób określenia daty końca miesiąca niż uzyskanie czasu pracy? Jakakolwiek pomoc w ogóle byłaby bardzo doceniana.
(PS, uruchamiamy to zadanie w SQL Server 2008 R2). Sprawdziłem z DBA i nie powiedział nic o lokalizacji lub zmianie ustawień regionalnych na serwerze SQL.
Wygląda na to, że próbujesz obliczyć 16 z ostatniego miesiąca. Zamiast manipulować ciągami, wypróbuj 'SET @StartDate = DATEADD (miesiąc, DATEDIFF (miesiąc, '20010101', @ RunDate), '20001216')', który powinien zawsze go znaleźć (zachować dwie stałe łańcuchowe dokładnie takie jakie są) . –
Czy jesteś pewien, że błąd znajduje się w sekcji opublikowanego kodu? 101 na linii CONVERT (datetime, @strStartDate, 101) wskazuje, że strStartDate powinien być w formacie mm/dd/rrrr, który to jest, więc nie powinien być zależny od ustawień regionalnych Serwera. – sgmoore
@Damien_The_Unbeliever Tak, zapytanie to będzie zawsze uruchamiane od 1 do 16 dnia miesiąca. Jeśli nie jest uruchamiany 16 dnia miesiąca, musi być pierwszy, więc chcemy, aby wartość StartDate reprezentowała 16 dzień poprzedniego miesiąca. (Zasadniczo chcemy tylko uzyskać dzień # 16 poprzedniego miesiąca, jeśli zapytanie jest uruchamiane w dniu 1) Nie jestem językiem SQL, ale czy ten kod, który podałeś, działa przez miesiąc? Lub po prostu zrobić na grudzień? – Oryx