2016-03-07 121 views
1

我正在嘗試使用SQL Server代理自動執行任務以生成定期插入表的人員的報告。我創建了下面的存儲過程,並試圖在SQL Server代理作業中使用相同的查詢,但無法運行,有人可以請幫忙。如何根據GETDATE檢索記錄

SELECT s.LAST_NAME AS sn, 
RTRIM(s.FIRST_NAME)+ ' ' + LTRIM(s.LAST_NAME) AS Name, 
s.FIRST_NAME AS F_Name 
LEFT(middle_name,1) AS Initial, 
sy.USERNAME AS USER, 
s.HOME_ZIP AS ZIP, 
RTRIM(UPPER(sy.USERNAME)) + LTRIM('@xyz.com') AS userP, 
stm.DESCRIPTION_Maj AS company, 
rg.RECORD_INPUT_DATE 
FROM STCIO s 
JOIN SYSME sy 
ON s.ID_NUMBER =sy.ID_NUMBER 
JOIN EHMGR rg 
ON s.ID_NUMBER =rg.ID_NUMBER 
JOIN STMEER stm 
ON rg.MAJOR =stm.MAJOR 
AND s.MAT_CODE IN ('','G','Q') 
AND rg.CURRENT_FLAG = 'X' 
AND CONVERT(datetime,CONVERT(CHAR(8),rg.RECORD_INPUT_DATE)) = GETDATE() 

注意:數據類型是Record_input_date接收numeric(8,0)

錯誤消息是

「算術溢出錯誤將表達式轉換爲數據類型日期時間」。

我沒有權限進行任何更改。我要查找的所有信息都是將此查詢轉換爲record_input_date(數字)至datetime,並根據getdate()

回答

0

填充記錄第1步將此牆的文本查詢轉換爲您可以閱讀的內容。

SELECT s.LAST_NAME AS sn 
    , RTRIM(s.FIRST_NAME) + ' ' + LTRIM(s.LAST_NAME) AS Name 
    , s.FIRST_NAME AS F_Name 
    , LEFT(middle_name, 1)AS Initial 
    , sy.USERNAME AS [USER] 
    , s.HOME_ZIP AS ZIP 
    , RTRIM(UPPER(sy.USERNAME)) + '@xyz.com' AS userP 
    , stm.DESCRIPTION_Maj AS company 
    , rg.RECORD_INPUT_DATE 
FROM STCIO s 
JOIN SYSME sy ON s.ID_NUMBER = sy.ID_NUMBER 
JOIN EHMGR rg ON s.ID_NUMBER = rg.ID_NUMBER 
JOIN STMEER stm ON rg.MAJOR = stm.MAJOR 
    AND s.MAT_CODE in ('', 'G', 'Q') 
    AND rg.CURRENT_FLAG = 'X' 
    AND CONVERT(DATETIME, CONVERT(CHAR(8), rg.RECORD_INPUT_DATE)) = GETDATE() 

這裏的問題是你有一個不能轉換爲日期時間值的整數。這是使用不正確數據類型的固有問題。您很可能會被迫從此查詢中刪除日期條件並將其替換爲ISDATE。將這些結果插入臨時表。然後用你的日期謂詞從temp表中拉出另一個查詢。

1

現在,如果你仍然有(非ANSI格式)

像代替20160307存儲爲數字的格式不正確的日期爲今天的日期它存儲爲20160703在這種情況下,它會給錯誤會發生這種情況值如20162002或日期存儲爲ddmmyyyy或任何其他變體格式。在一些示例數據解決的外觀和調整您的查詢

CONVERT(datetime,convert(char(8),rg.RECORD_INPUT_DATE)) = GETDATE() 

CONVERT(datetime,convert(char(8),rg.RECORD_INPUT_DATE),<formatstring>) = GETDATE() 

見格式的字符串列表here

另一種方法是使用date from parts功能在更高版本的SQL Server像

SELECT DATEFROMPARTS(RECORD_INPUT_DATE/10000, 
        RECORD_INPUT_DATE % 100, 
        (RECORD_INPUT_DATE/ 100) % 100) AS YR_MNTH_DT 

如果你ca如果沒有使用上述任何一項,則必須從數字中分離出幾天,幾個月和一年。 例子,如果你的號碼是一樣DDMMYYYY(03062016)

DECLARE @dd INT, @mm INT, @yyyy INT, @newdate INT 
SET @dd= RECORD_INPUT_DATE/1000000 --3 
SET @mm= (RECORD_INPUT_DATE/10000) %100--6 
SET @yyyy= (RECORD_INPUT_DATE) % 10000--2016 
SET @newdate= @yyyy*[email protected]*[email protected] 

,並使用此@newdate比較

CONVERT(datetime,convert(char(8),@newdate)) = GETDATE() 
+0

感謝您的投入和極大的幫助格式不對,我做了一些代碼更新,如下圖所示:RG .RECORD_INPUT_DATE =(CAST(CONVERT(VARCHAR(8),GETDATE(),112)AS INT))和它的工作如飛。 – Khatra

+0

感謝您的回覆。請投票我的答案和/或接受它作爲正確的答案,如果你覺得它有用。這將有助於其他面臨類似問題的人。要知道如何接受答案,請參閱http://stackoverflow.com/help/someone-answers – DhruvJoshi