我正在尝试使用SQL Server代理自动执行任务,以生成定期插入表中的人员的报告。我创建了下面的存储过程,并尝试在SQL Server代理程序作业中使用相同的查询但是无法正常工作,请有人帮忙。
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)
收到的错误消息是
“将表达式转换为数据类型datetime的算术溢出错误。”
我无权进行任何更改。我正在寻找的是让这个查询正在运行,将record_input_date
(数字)转换为datetime
,并根据getdate()
答案 0 :(得分: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
另一种方法是在更高版本的sql server中使用date from parts
函数,如
SELECT DATEFROMPARTS(RECORD_INPUT_DATE / 10000,
RECORD_INPUT_DATE % 100,
(RECORD_INPUT_DATE/ 100) % 100) AS YR_MNTH_DT
如果你不能使用上述任何一种,你必须从数字中隔离日,月和年。 例如,如果您的号码格式错误,例如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*10000+@mm*100+@dd
并使用此@newdate进行比较
CONVERT(datetime,convert(char(8),@newdate)) = GETDATE()
答案 1 :(得分: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。将这些结果插入临时表。然后使用日期谓词从临时表中提取另一个查询。