仅当 varchar 包含有效日期时,如何将其转换为日期?

2024-03-01

我正在寻找有关 SQL Server Management Studio 的我认为非常有用的信息。

我有一个带有 type 列的表varchar存储日期、数字和字符串。

这些日期以以下格式存储:

dd/mm/aaaa

我有一个搜索匹配行的查询,一个要求是用户必须能够在日期(时间段)之间进行搜索。

如果我只有日期,那就没有什么神秘的,我可以使用查询:

where convert(datetime,a.valor,103) between '01/01/2013' and '03/01/2013'

问题是,当到达值不是日期的行时,此查询会失败。

由于可能有数千行需要搜索,执行该查询的有效方法是什么?


典型的答案是添加一个 WHERE 子句:

WHERE ISDATE(a.valor) = 1

然而,由于以下几个原因,这在您的情况下是有问题的:

  1. ISDATE()不一定符合您想要的方式,具体取决于服务器的区域设置、用户的语言或日期格式选项等。例如:

    SET DATEFORMAT dmy;
    SELECT ISDATE('13/01/2012'); -- 1
    
    SET DATEFORMAT mdy;
    SELECT ISDATE('13/01/2012'); -- 0
    
  2. 您无法真正控制 SQL Server 将尝试执行CONVERT过滤器后。

您甚至不能使用子查询或 CTE 来尝试将过滤器与 CONVERT 分开,因为 SQL Servercan以它认为更有效的任何顺序优化查询中的操作。

例如,对于有限的样本,您可能会发现这工作正常:

SET DATEFORMAT dmy;

SELECT valor, valor_date FROM (
  SELECT valor, valor_date = CONVERT(DATE, 
    CASE WHEN ISDATE(valor) = 1 THEN valor ELSE NULL END, 103)
  FROM dbo.mytable
  WHERE ISDATE(valor) = 1
) AS sub WHERE valor_date BETWEEN '01/01/2012' AND '01/03/2012';

但我也见过这种构造的情况,其中 SQL Server 尝试首先评估过滤器,导致您当前遇到的相同错误。


一些更安全的解决方法:


添加计算列,例如

ALTER TABLE dbo.mytable ADD valor_date
  AS CONVERT(DATE, CASE WHEN ISDATE(valor) = 1 THEN valor 
    ELSE NULL END, 103);

为了保护自己在运行时免受可能的误解,您应该在发出引用计算列的查询之前指定日期格式,例如

SET DATEFORMAT dmy;
SELECT valor, valor_date FROM dbo.mytable WHERE ...;

创建视图:

CREATE VIEW dbo.myview
AS
  SELECT valor, valor_date = CONVERT(DATE, 
    CASE WHEN ISDATE(valor) = 1 THEN valor ELSE NULL END, 103)
  FROM dbo.mytable
  WHERE ISDATE(valor) = 1;

同样,您需要发出SET DATEFORMAT查询视图时。


使用临时表:

SELECT <cols>
INTO #foo
FROM dbo.mytable
WHERE ISDATE(valor) = 1;

SELECT <cols>, CONVERT(DATE, valor) FROM #foo WHERE ...;

您可能仍想使用DATEFORMAT保护自己免受之间冲突的影响ISDATE和用户设置。


不,你应该not尝试使用字符串模式匹配将字符串验证为日期,如另一个(现已删除)答案中的建议:

like '%__/%' or like '%/%'

您必须在那里进行一些相当复杂且严格的验证才能处理所有有效日期,包括闰年。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅当 varchar 包含有效日期时,如何将其转换为日期? 的相关文章

随机推荐

  • Docker 运行不工作,它说需要至少 1 个参数

    我正在学习 docker 并尝试运行现有的映像 第一个命令工作正常 command 1 docker run name static site e AUTHOR Mathi1 d P dockersamples static site 但下
  • 保持 Git 功能分支最新的策略

    我喜欢让我的功能分支与开发保持同步 频繁执行 git merge no ffdevelopment 有什么问题吗 然后最后运行 git flow feature finish feature1 这些功能分支是共享的 这意味着其他人可能正在处
  • 我需要在 MVC Razor 中对属性值进行编码吗?

    在 cshtml 文件中 我将一个字符串分配给一个属性 例如
  • Android 机器人测试与 Teamcity 的接口

    由于之前没有回答这个问题 也许我没有找到 我调查了以下问题 如何使用robotium在Android设备上执行自动化功能测试 并将其报告给TeamCity等持续集成服务器 由于我没有找到该具体问题的任何答案 因此我进行了调查 以下是我的调查
  • 仅在主页上显示块 HTML?

    我尝试修改家庭控制器添加新变量 data header home true 然后我尝试检查一下header twig模板如下 if header home div Home div else div Not Home div endif 当
  • Qt 5.1 中带有共享 QGLWidgets 的线程 OpenGL 问题

    我使用两个 QGLWidget 一种用于加载纹理 一种用于渲染 但它不起作用 我使用了以下解释http blog qt digia com blog 2011 06 03 threaded opengl in 4 8 http blog q
  • 我可以在我的 Maven Android 项目中使用 AdMob SDK jar 作为依赖项吗?

    我只是将构建过程切换为使用 Maven 我在 Maven 存储库站点上找不到 AdMob 的依赖项 如何手动配置它 例如
  • 计算 Pandas 中各组的同比增长

    我有以下内容dataframe In 1 df Out 1 ID Month Transaction Amount 1 2013 01 10 1 2013 02 20 1 2013 03 10 1 2013 04 20 1 2013 05
  • Swift 协议:方法不会覆盖其超类中的任何方法

    由于 Xcode 6 仍然存在许多 Swift 错误 我不确定是其中之一还是我遗漏了一些东西 我的类采用协议 NSLayoutManagerDelegate 但似乎不可能覆盖我需要的方法 我按照文档描述的那样做 override func
  • 如何创建基于浏览器的系统的安装程序?

    我刚刚开发了一个基于浏览器的员工管理系统 我想知道是否有办法创建安装程序或自解压文件 以便轻松地将系统转移到另一台计算机 我尝试过使用 iexpress exe 和 实际安装程序 但它们似乎只提取到一个目录中 有没有办法让我使用这些应用程序
  • 是否可以同时使用JSP和PHP?

    一个函数是用Java编写的 而另一个函数的API是用PHP编写的 那么 JSP和PHP是否可以同时使用呢 我想说你可以打电话 来自您的Java代码 一种不同的进程来执行 PHP 脚本 然后在 Java 代码中使用该 PHP 脚本的输出 但这
  • 快速排序 - 使其稳定的条件

    如果排序算法保留具有 equals 键的任意两个元素的相对顺序 则该算法是稳定的 快速排序在什么条件下稳定 当没有项被传递时 快速排序是稳定的 除非它具有较小的键 还有哪些条件可以使其稳定 嗯 使用 O N 空间而不是就地不稳定实现使用的
  • 为什么函数体内定义的内置类型的未初始化对象具有未定义的值?

    问题 为什么定义内置类型的未初始化对象inside函数体具有未定义的值 而内置类型的对象已定义outside任何函数的初始化为0 or 举个例子 include
  • 如何将 Makefile 中的警告视为错误?

    是否可以将警告视为 Makefile 中的错误 从而在 Makefile 继续之前退出 此外 是否可以过滤掉哪个警告会产生错误 我的用例 我想使用 warn undefined variables与此结合 当变量未定义时 Makefile
  • 在 Bluehost 上部署 Ruby on Rails

    这里有人知道如何在 Bluehost 上部署 Ruby 应用程序吗 我对此有很大的问题 每次我将文件放入域名指向的文件夹中时 当我尝试访问该网站时 它总是会出现 403 错误 太痛苦了 这指示 https my bluehost com c
  • 在处理发生时动态刷新 JTextArea?

    我正在尝试创建一个非常简单的 Swing UI 当处理在后台进行时 该 UI 通过 JTextArea 将信息记录到屏幕上 当用户单击按钮时 我希望每次调用 textArea append someString n 立即显示在 UI 中 目
  • python 2.x 中的 textinput() 等效项

    我需要在 python 的海龟中接受用户的信息 但是 turtle textinput 函数仅适用于 3 x 及更高版本 我可以在 2 X 版本中使用替代方案吗 这是什么textinput实际上是 import tkSimpleDialog
  • Jetty - 设置系统属性[重复]

    这个问题在这里已经有答案了 我在 Jetty 上运行 webapp 应用程序的配置来自运行 Jetty 的同一服务器上的文件 在应用程序内部 我依靠系统属性来获取文件的路径 以便我可以解析它 例如 final String loc Syst
  • 如何在任何 Web 服务器(Apache 或 Mongrel 或任何其他服务器)中运行简单的 ruby​​ 脚本

    我觉得很有趣的是 当我搜索与 Ruby 相关的内容时 所有与 Ruby on Rails 相关的结果都会弹出 那么没人再使用原始红宝石了吗 然而 我是红宝石新手 今天早上我只是想在网络服务器中运行一个简单的 hello world ruby
  • 仅当 varchar 包含有效日期时,如何将其转换为日期?

    我正在寻找有关 SQL Server Management Studio 的我认为非常有用的信息 我有一个带有 type 列的表varchar存储日期 数字和字符串 这些日期以以下格式存储 dd mm aaaa 我有一个搜索匹配行的查询 一