Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将YYYYMMDDxxxxx转换为可使用日期_Sql_Sql Server_Date - Fatal编程技术网

Sql 将YYYYMMDDxxxxx转换为可使用日期

Sql 将YYYYMMDDxxxxx转换为可使用日期,sql,sql-server,date,Sql,Sql Server,Date,好吧,我知道我的很多问题都是基于日期格式的,但这是我的问题。我正在处理一个字段,我们称之为ABCTIME,它以数字格式保存,并显示为20110517151750 ie 2011-05-17:15:17:50。我需要能够将其转换为日期或datetime,以便使用datediff显示大于或=todays date GETDATE的所有记录。此外,我无法更改表的格式。任何帮助都将不胜感激。谢谢- 编辑-我需要显示比今天日期长1年或更长的所有记录 将getdate转换为YYYYMMDDXXXXXX以过滤

好吧,我知道我的很多问题都是基于日期格式的,但这是我的问题。我正在处理一个字段,我们称之为ABCTIME,它以数字格式保存,并显示为20110517151750 ie 2011-05-17:15:17:50。我需要能够将其转换为日期或datetime,以便使用datediff显示大于或=todays date GETDATE的所有记录。此外,我无法更改表的格式。任何帮助都将不胜感激。谢谢-


编辑-我需要显示比今天日期长1年或更长的所有记录

将getdate转换为YYYYMMDDXXXXXX以过滤大于或等于今天的数据,而不是将数据转换为适合这一条件,效率会高得多

编辑-显示比今天日期早1年或更长的所有记录

SELECT
    *
FROM your_table
WHERE yyyymmddxxxxxx >= cast( convert(varchar, dateadd(YEAR,1,getdate()) ,112) AS bigint) * 1000000
您的样本在2012年之后没有任何变化,因此我将其更改为2015年,结果如下:

    CREATE TABLE sample_data
        ([Case] int, [Service] varchar(13), [DateInt] bigint)
    ;

    INSERT INTO sample_data
        ([Case], [Service], [DateInt])
    VALUES
        (1, 'CHAMP VA', 20120928073334),
        (2, 'MACSIS-MH POS', 20120927103950),
        (3, 'MACSIS-MH POS', 20150927084716)
    ;

**Query 1**:

    --YYYYMMDDXXXXXX
    SELECT
           DateInt
         , convert(date,convert(varchar,DateInt / 1000000),112) as_date
         , DateInt / 1000000                                    as_int_yyymmdd
    FROM sample_data
    WHERE DateInt >= cast( convert(varchar, dateadd(YEAR,1,getdate()) ,112) AS bigint) * 1000000


**[Results][2]**:

    |        DATEINT |    AS_DATE | AS_INT_YYYMMDD |
    |----------------|------------|----------------|
    | 20150927084716 | 2015-09-27 |       20150927 |

如果您使用的是SQLServer2008及其以后的版本,请参见。SQLServer2008现在有一个日期数据类型,它只包含一个没有时间的日期。因此,您可以执行以下操作:

SELECT CONVERT(date, getdate())

您可以创建如下函数:

    CREATE FUNCTION udf_convert_int_date (@date_in INT)  
RETURNS datetime 
AS 
BEGIN 
   DECLARE @date_out datetime 
   SET @date_out = CONVERT(datetime, CAST(@date_in AS CHAR(8)), 101) 

   RETURN @date_out 
END 
| YYYYMMDDXXXXXX | YYYY | MM | DD | HH | MI | SS |
|----------------|------|----|----|----|----|----|
| 99990410123456 | 9999 |    |    |    |    |    |
| 20149910123456 |      | 99 | 10 |    |    |    |
| 20140499123456 |      |    | 99 |    |    |    |
| 20140410993456 |      |    |    | 99 |    |    |
| 20140410129956 |      |    |    |    | 99 |    |
| 20140410123499 |      |    |    |    |    | 99 |
| 20140231123499 |      |    | 31 |    |    |    |

它可能并不漂亮,但如果每个部分都有一个设置的格式和字符,您能简单地使用子字符串或类似的函数将其分解吗?在SQL Server中,要将日期转换为120格式yyyy mm dd hh:mi:ss,如下所示:

SELECT
    -- 20110517151750 to 2011-05-17 15:17:50
    SUBSTRING('20110517151750', 1, 4) AS Year,
    SUBSTRING('20110517151750', 5, 2) AS Month,
    SUBSTRING('20110517151750', 7, 2) AS Day,
    SUBSTRING('20110517151750', 9, 2) AS Hour,
    SUBSTRING('20110517151750', 11, 2) AS Minute,
    SUBSTRING('20110517151750', 13, 2) AS Second,
    CONVERT(datetime, SUBSTRING('20110517151750', 1, 4) + '-' + SUBSTRING('20110517151750', 5, 2) + '-' + SUBSTRING('20110517151750', 7, 2) + ' ' + SUBSTRING('20110517151750', 9, 2) + ':' + SUBSTRING('20110517151750', 11, 2) + ':' + SUBSTRING('20110517151750', 13, 2), 120) AS ParsedDate
FROM ...

可以查询当前格式的日期。我不明白你为什么需要重新格式化日期。如果今天的日期减去1年是2012年12月31日,则返回ABCTIME>=20121231000000的所有记录

编辑,使用ISDATE对验证、方法更改有意义

关于转换错误,我只能假设某些数据不符合某些日期/时间“规则”。考虑到这一点,也许可以尝试类似的方法来发现这些条件。这太简单了,但可能会有帮助。请注意,您可以先进行计数,因为我不知道您处理了多少记录,也不会说这会非常快

SELECT
  yyyymmddxxxxxx
, CASE WHEN isdate( (yyyy + '0101') ) = 0
            OR ( yyyy < '1960' OR yyyy > '2020' ) THEN yyyy ELSE '' END AS yyyy
, CASE WHEN isdate( (yyyy + mm + '01') ) = 0      THEN mm ELSE '' END AS mm
, CASE WHEN isdate( (yyyy + mm + dd) ) = 0        THEN dd ELSE '' END AS dd
, CASE WHEN ( hh > '23' )                         THEN hh ELSE '' END AS hh
, CASE WHEN ( mi > '59' )                         THEN mi ELSE '' END AS mi
, CASE WHEN ( ss > '59' )                         THEN ss ELSE '' END AS ss
FROM your_table
CROSS apply (SELECT convert(varchar(14), yyyymmddxxxxxx)) AS ca1 (int2str)
CROSS apply (SELECT
                     substring(int2str, 1,4) -- yyyy
                   , substring(int2str, 5,2) -- mm
                   , substring(int2str, 7,2) -- dd
                   , substring(int2str, 9,2) -- hh
                   , substring(int2str,11,2) -- mi
                   , substring(int2str,13,2) -- ss
             ) AS ca2 (yyyy,mm,dd,hh,mi,ss)
WHERE ISDATE(convert(varchar(8),int2str,112)) = 0
OR ISDATE( (hh + ':' + mi + ':' + ss) ) = 0
OR         ( yyyy < '1960' OR yyyy > '2020' ) -- arbitrary, ignore of change to suit
;

你在用什么数据库管理系统?老实说,我们不知道你的大多数问题都是基于日期格式的。你是哪种语言using@vels4j胡乱猜测,但可能是sql。您是否有证据支持将GETDATE转换为OP的格式更有效?您好,不,时间并不重要,但如果随着时间的推移更容易转换,那么它就不重要了。证据?sargable:这个问题涉及到选择信息>=getdate,因此,除非表中只有一条记录,否则应用函数转换数据将比针对单个系统变量执行的某些函数执行的要多得多,并且通过避免使用数据上的函数,可以使用现有索引。尝试了这个方法。返回0个结果。没有错误,但没有带日期的字段。我知道应该有几千条记录带有我指定的参数…还有其他选项吗?非常感谢。你能提供一些示例数据吗?请你解释一下,我是否遗漏了什么:-?你可以用你想要转换的任何日期替换getdate。在你的情况下,我是SQL的新手,你确定吗?你能用20110517151750这种类型的字段发布一个例子吗?只要测试一下,看看它是否适合你。请尝试从MyTableName中选择CONVERTdate、MyTableName.ABCTIME之类的操作,如果不起作用,请尝试从MyTableName中选择CONVERTdate、MyTableName.ABCTIME、110。如果您需要不同的格式,还可以查看。对,但此查询将插入到Business Intel中。Dev.Studio将在未来的报告中使用,因此数据需要每天随日期移动。