【问题标题】:parse a string date in particular format, fail otherwise以特定格式解析字符串日期,否则失败
【发布时间】:2017-10-23 19:57:37
【问题描述】:

是的,我知道以下不是最佳实践,而是继承了 db。

我的字符串为 'MM/dd/yy tt:hh:mm'。有时字符串是错误的 'tt:hh:mm'。

如果我将 'tt:hh:mm' 转换为日期时间,它会成功,并将默认日期设置为 1900-01-01。我希望这失败。

isdate('08:00:00') 成功返回 1。

我想要以下内容:

myisdatetime(' 08:00:00') fails return 0
myisdatetime( 'MM/dd/yy tt:hh:mm') success returns 1

甚至可以指定日期时间格式。即精确解析。

【问题讨论】:

  • 也许只是转换为日期时间,然后检查字符串是否包含子字符串1900-01-01 并因此失败?那个日期曾经是一个有效的条目吗? @SeanLange 也有一个很好的观点
  • 也许就像检查 '/' 的 charindex 一样简单??
  • 当然,这不是正确的格式吗?你的意思是说MM/dd/yy tt:hh:mm? (您指定了两次mm [分钟],一次用于月份,一次用于分钟)。
  • At times string is 'tt:hh:mm' in error. - 你这么说,但你的例子显示了08:00:00 的测试用例。这不是您指定的格式...tt:hh:mm = PM:04:17,这是表示时间的一种非常奇怪的方式,但与您的问题不符。
  • 这种格式的tt是什么?不应该是 hh:mm:ss 吗?

标签: sql-server date parsing datetime


【解决方案1】:

只需使用 CONVERT

DECLARE @InputTime VARCHAR(20) = ' 08:00:00';
SELECT TRY_CONVERT(TIME, @InputTime, 114);
SELECT CONVERT(TIME, @InputTime, 114);

您现在应该输入数据 - 如果您想在空间不足的情况下失败 - 只需检查它:

DECLARE @Result BIT = 0;
SET @Result = CASE CHARINDEX(' ', @InputTime) WHEN 0 THEN 0 ELSE 1 END;
SELECT @Result;

与 DATETIME 类似

DECLARE @InputDT VARCHAR(20) = '23/10/17 08:00:00';
SELECT TRY_CONVERT(DATETIME, @InputDT, 3);
SELECT CONVERT(DATETIME, @InputDT, 3);

更多:https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    相关资源
    最近更新 更多