如何根据GETDATE检索记录

时间:2016-03-07 16:09:06

标签: sql-server tsql

我正在尝试使用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()

填充记录

2 个答案:

答案 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。将这些结果插入临时表。然后使用日期谓词从临时表中提取另一个查询。