SQL表日期时间列格式

SQL表日期时间列格式,sql,sql-server,database,Sql,Sql Server,Database,我试图用谷歌搜索得到答案,但没有成功。以下是我的要求 用户可以选择将数据插入到将导出日期作为日期时间的表中 当他们执行insert语句时,我想确保他们已经输入了“dd-MM-yyy-hh:MM:ss”格式的日期。如果不是,则不允许运行insert查询 或者允许用户以任何格式(如dd-MM-yyyy或dd/MM/yyyy)输入日期,但在内部将其转换为所需格式“dd-MM-yyyy hh:MM:ss”并存储 有人可以帮助/指导我吗?如果您希望用户以“dd-MM-YYYY”格式输入日期,您可能会遇到问

我试图用谷歌搜索得到答案,但没有成功。以下是我的要求

  • 用户可以选择将数据插入到将导出日期作为日期时间的表中
  • 当他们执行insert语句时,我想确保他们已经输入了“dd-MM-yyy-hh:MM:ss”格式的日期。如果不是,则不允许运行insert查询
  • 或者允许用户以任何格式(如dd-MM-yyyy或dd/MM/yyyy)输入日期,但在内部将其转换为所需格式“dd-MM-yyyy hh:MM:ss”并存储

  • 有人可以帮助/指导我吗?

    如果您希望用户以“dd-MM-YYYY”格式输入日期,您可能会遇到问题,因为如果用户以MM-dd-YYYY格式输入,您将得到不同的结果。“YYYMMDD”是SQL Server将始终正确解释的通用格式

    从用户处获取日期后,可以使用所需的特定格式进行转换。以下内容将日期转换为ISO8601格式:

    SELECT   
        GETDATE() AS UnconvertedDateTime,   
        CONVERT(nvarchar(30), GETDATE(), 126) AS UsingConvertTo_ISO8601  ;  
    GO
    

    有关特定日期格式的更多信息,我建议您签出。

    如果希望用户以“dd-MM-YYYY”格式输入日期,您可能会遇到问题,因为如果用户以MM-dd-YYYY格式输入,您将得到不同的结果。“YYYMMDD”是SQL Server将始终正确解释的通用格式

    从用户处获取日期后,可以使用所需的特定格式进行转换。以下内容将日期转换为ISO8601格式:

    SELECT   
        GETDATE() AS UnconvertedDateTime,   
        CONVERT(nvarchar(30), GETDATE(), 126) AS UsingConvertTo_ISO8601  ;  
    GO
    

    有关特定日期格式的更多信息,我建议您签出。

    您可以使用设置日期格式

    示例

    使用了
    date
    的数据类型进行说明,但显然可以使用
    datetime

    Set DateFormat DMY
    Select try_convert(date,'15/08/2017')   -- Returns 2017-08-15
    
    Set DateFormat MDY
    Select try_convert(date,'15/08/2017')   -- Returns NULL
    
    Set DateFormat YMD
    Select try_convert(date,'15/08/2017')   -- Returns NULL
    

    您可以使用设置日期格式

    示例

    使用了
    date
    的数据类型进行说明,但显然可以使用
    datetime

    Set DateFormat DMY
    Select try_convert(date,'15/08/2017')   -- Returns 2017-08-15
    
    Set DateFormat MDY
    Select try_convert(date,'15/08/2017')   -- Returns NULL
    
    Set DateFormat YMD
    Select try_convert(date,'15/08/2017')   -- Returns NULL
    

    事实上,无论排序规则设置如何,只有两种格式可以保证工作,它们是YYYYMMDD和YYYY-MM-DD。。。除此之外,唯一的判断方法是用户使用的MM-DD-YYYY与DD-MM-YYYY,如果日期大于12,则无法判断。@JasonA.Long:语言设置,而不是排序规则。根据,没有时间,
    YYYY-MM-DD
    是不安全的。@jeroenmoster,我已更正,谢谢您提供的信息。如果您在数据库之外处理数据,请在那里强制执行格式,并将键入的
    DATETIME
    参数传递给数据库。如果您只关心人们在数据库中做什么,要么让他们自己去做,要么根本不授予他们
    INSERT
    权限,而是要求他们调用一个存储过程,在那里您可以进行检查。即使如此,您也无法从认为格式为
    MM dd yyyy
    的用户那里得知
    01-02-2000 00:00:00
    是2月1日而不是1月2日。这就是为什么你一开始就不应该允许模棱两可。谢谢你,约翰和伊卡斯汀的帮助。在阅读了评论和答案之后,我决定不依赖用户来设置日期列的格式。我提出了一个小型java实用程序,可以解析excel并以我需要的格式将数据上传到表中。实际上,无论排序规则设置如何,只有两种格式可以保证工作,它们是YYYYMMDD和YYYY-MM-DD。。。除此之外,唯一的判断方法是用户使用的MM-DD-YYYY与DD-MM-YYYY,如果日期大于12,则无法判断。@JasonA.Long:语言设置,而不是排序规则。根据,没有时间,
    YYYY-MM-DD
    是不安全的。@jeroenmoster,我已更正,谢谢您提供的信息。如果您在数据库之外处理数据,请在那里强制执行格式,并将键入的
    DATETIME
    参数传递给数据库。如果您只关心人们在数据库中做什么,要么让他们自己去做,要么根本不授予他们
    INSERT
    权限,而是要求他们调用一个存储过程,在那里您可以进行检查。即使如此,您也无法从认为格式为
    MM dd yyyy
    的用户那里得知
    01-02-2000 00:00:00
    是2月1日而不是1月2日。这就是为什么你一开始就不应该允许模棱两可。谢谢你,约翰和伊卡斯汀的帮助。在阅读了评论和答案之后,我决定不依赖用户来设置日期列的格式。我提出了一个小型java实用程序,它解析excel并以我需要的格式将数据上传到表中。