【问题标题】:datename conversion fails in SQL agent only日期名称转换仅在 SQL 代理中失败
【发布时间】:2017-02-07 20:35:11
【问题描述】:

所以我正在通过 SQL Server 管理工作室中的代理执行存储过程。当我正常运行我的存储过程时,它运行良好,没有返回任何错误,但是当它从代理运行时,它无法运行。

我的存储过程:

USE [Sales]
GO
/****** Object:  StoredProcedure [dbo].[forecastprojSPChartDetailsForPlaInsert]    Script Date: 29/09/2016 12:50:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[forecastprojSPChartDetailsForPlaInsert] 
    -- Add the parameters for the stored procedure here
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

                Select DISTINCT 

                 MIN(S.Id) As Id
               , S.DATE_DEL
               ,'0.00' AS Installation 
               , SD.ProjectNo
               , SHA.[Customer Name]
               , P2.[Project Name]
               , AD.ApplicationDate
               , AD.IssueOfPaymentNotice
               , AD.FinalDateForSubPayment
               , AD.ValuationDate
               , CF.Comment
               , CF.QsNotified
               , CF.AccountsNotified
               , CF.CallBackDate
               , CF.PaidAmount
               , CF.PrevPaidOtherTextBox
               , CF.ConfirmedFinalDate
               , CF.ConfirmedPaidDate
               , CF.RemovedCheck
               , CF.RemovedCheckComment
               , 'No' as SO
               , CF.ApplicationDateChanged

               ,datename(month,SC.DateOfSend)
               ,datename(month,S.Date_Del)
               ,datename(month,AD.ApplicationDate) 

                from SODDFD S 
                INNER JOIN SpecDetails SD ON SD.SrecId = S.Srecid 
                INNER JOIN SpecificationHeader SHA ON SD.QuoteNo = SHA.Qno 
                INNER JOIN Projects2 P2 ON P2.PID = SHA.PID 
                INNER JOIN SentContracts SC on SC.PID = P2.PID and SC.DD = '1'
                INNER JOIN ApplicationDates AD on SHA.PID = AD.PID 

                AND
                 CASE WHEN CONVERT(DATE,GETDATE(),103) > CONVERT(DATE,AD.ApplicationDate,103) THEN datename(month,SC.DateOfSend)
                 ELSE datename(month,S.Date_Del)
                 END = datename(month,AD.ApplicationDate) 

                LEFT OUTER JOIN SentappDetails SA ON SA.SrecId = SD.SrecId 
                LEFT JOIN CashFlowProjectionTbl CF on AD.PID = CF.PID and AD.ApplicationDate = CF.ApplicationDate

               where 
                S.PID in (Select distinct PID from ApplicationDates) AND
                S.Id <> 0 AND
                S.Id <> '' AND
                Nominal = CASE WHEN SD.NewSellingPrice IS NULL THEN Nominal ELSE 'S001' END AND
                s.DATE_DEL <> ''AND
                (AD.ApplicationDate like '%/2016' or ConfirmedFinalDate <> '' or ConfirmedFinalDate IS NOT NULL)
                and (convert(date,IssueOfPaymentNotice,103) >= '01/05/2016' or ConfirmedFinalDate <> '' or ConfirmedFinalDate IS NOT NULL)
                --and (Cf.PaidAmount = '0' or Cf.PaidAmount = '0.00' or Cf.PaidAmount = '' or Cf.PaidAmount is NULL) 
                and (RemovedCheck = '' or RemovedCheck is NULL)
                and convert(date,Ad.ApplicationDate,103) >= '01/06/2016' 


                GROUP BY   S.PID, SD.NewSellingPrice, s.DATE_DEL, SA.CURR_APP, s.DEL_QTY, Comment, QsNotified, AccountsNotified,
                CASE WHEN SD.NewSellingPrice IS NULL THEN S.Id END ,SD.ProjectNo, SHA.[Customer Name], P2.[Project Name], 
                AD.ApplicationDate, ad.IssueOfPaymentNotice, AD.FinalDateForSubPayment, CF.CallBackDate,  
                CF.PaidAmount   , CF.PrevPaidOtherTextBox, CF.ConfirmedFinalDate, AD.ValuationDate, CF.ConfirmedPaidDate, CF.RemovedCheck, CF.RemovedCheckComment, CF.ApplicationDateChanged
                   ,datename(month,SC.DateOfSend)
               ,datename(month,S.Date_Del)
               ,datename(month,AD.ApplicationDate) 


    END

当它从我的代理运行时,它无法返回此错误:

但是,如果我替换:

        AND
         CASE WHEN CONVERT(DATE,GETDATE(),103) > CONVERT(DATE,AD.ApplicationDate,103) THEN datename(month,SC.DateOfSend)
         ELSE datename(month,S.Date_Del)
         END = datename(month,AD.ApplicationDate) 

与:

        AND
         CASE WHEN CONVERT(DATE,GETDATE(),103) > CONVERT(DATE,AD.ApplicationDate,103) THEN 'July'
         ELSE 'July'
         END = 'July'

...运行良好。

我唯一能想到的是,当它从我的代理运行时,我的“DATENAME”转换出现错误。请记住我要通过的日期:

  • SC.DateOfSend
  • S.Date_Del
  • AD.ApplicationDate

都是dd/MM/yyyy格式。

我想知道是否有人可以帮助我或建议我该怎么做,因为我已经坚持了几个小时。提前谢谢你。

【问题讨论】:

  • 能补充一下错误吗?
  • 代理运行后服务器日志中是否有t-sql错误?
  • 查看已编辑的问题。 @AlexK。
  • 查看已编辑的问题。 @亚历克斯
  • 这将是与 dd/mm/yy vs yy/mm/dd 日期格式相关的问题。在字符串中指定文字日期时,请使用不可知的格式,例如 ISO yyyy/mm/dd,并确保列是 DATETIME。

标签: sql sql-server agent


【解决方案1】:

您需要更改服务器默认或登录默认语言

SELECT @@LANGUAGE 

函数DATENAME 取决于语言

SET LANGUAGE us_english

尝试在开始时捕获并在结束时按原样重新设置

declare @language as varchar(100)
SELECT @language= @@LANGUAGE 

SET LANGUAGE us_english 

--... your code...

SET LANGUAGE @language

【讨论】:

  • 所以我的 sql 代理以与我的用户不同的语言运行?
  • 我用的是 SET LANGUAGE British,非常感谢。
猜你喜欢
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多