【问题标题】:Converting Varchar to Datetime on SQL Server在 SQL Server 上将 Varchar 转换为日期时间
【发布时间】:2018-12-03 20:52:11
【问题描述】:
SELECT SubmitDate, Type, Location, CONVERT(DATETIME, SubmitDate, 101) AS DDate
FROM Employee
WHERE (Type IN ('C', 'Q')) 
  AND (DDate > DATEADD(DDate, - 1, GETDATE()))

我需要获取过去一年的所有记录,SubmitDatevarchar。我使用CONVERT 将列转换为datetime。但是我收到以下错误:

DDate 无法识别的 dateadd 选项。

我尝试将CONVERT 切换为以下内容,但没有成功:

CONVERT(DATE, SubmitDate, 101)

【问题讨论】:

  • 同级查询的 where 子句中不能访问别名/计算列
  • Dateadd 希望您告诉它what 您正在添加为第一个参数,例如日、周(查看文档)。
  • 您所说的“过去一年”到底是什么意思?您是指从 2018 年 1 月 1 日开始,还是什么?
  • 转换可能不是您的问题,您的 dateadd 存在语法问题。参数应为DATEADD(Day, -1, GETDATE()) 或您想要执行的任何时间间隔。
  • 根据你想要的cmetsWHERE (Type IN ('C', 'Q')) A and CONVERT(datetime, SubmitDate, 101) > dateadd(year,-1,getdate())

标签: sql sql-server database tsql


【解决方案1】:

正如用户在上面评论的那样,您不能在查询的 WHERE 子句中引用列别名。但是,您可以在 WHERE 子句中使用列转换。这不是很有效,但如果您使用查询一次或两次(即:不在 SSIS 包或自动化任务中),应该没问题。

SELECT SubmitDate, Type, Location,CONVERT(datetime, SubmitDate, 101) AS DDate
FROM Employee
WHERE ([Type] IN ('C', 'Q')) 
AND (CONVERT(datetime, SubmitDate, 101) > DATEADD(Day, - 1, GETDATE()))

查询的第二个问题是 DATEADD 子句。 DATEADD 需要三个参数:日期部分、数字和日期。您有一个无效的日期部分,或“您在日期的哪个部分执行算术”。 DDate 不是日期部分,而是列。日期部分是月、日、年、周等值。
我编辑了查询以将 datepart 设置为“Day”,因此子句将评估(使用 pseduocode)GETDATE()-1 Day,但您可以将其设置为 GETDATE()-1 Month 或小时。但是当前的 GETDATE()-1 DDate psedocode 表达式对您的 SQL Server 客户端没有意义

Refer to Microsoft documentation for more DATEADD information

【讨论】:

  • 酷,你修好了你的,所以我会删除我的。对同一个问题有两个答案是没有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2020-01-02
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多