当需要指定日期和时间数据类型的字符串文字值(常量)时,应该考虑以下几件事。首先,SQL Server并没有提供表达日期和时间字符串的具体方法,这听起来可能会有点古怪;相反,它允许你指定不同类型的字符串文字,再将其转换(显示或隐式地)为相应的日期和时间数据类型。使用字符串来表示日期和时间值是一种最佳实践,如下面这个例子所示:

1 SELECTorderid,custid,empid,orderdate
2 FROMSales.Orders
3 WHEREorderdate ='20070212';

  SQL Server会把文字'20070212'看作是一个字符串常量,而不是日期和时间常量;但因为表达式涉及了两种不同类型的操作数,所以就要把其中一种操作数的类型转换为另一种。当一个表达式涉及的两种操作数具有不同类型时,就需要把其中一种操作数的类型隐式地转换为另一种操作数的类型。通常,类型之间的隐式转换会基于所谓的数据类型优先级(datatype precedence)原则。SQL Server预先定义了数据类型之间的优先关系,运算时通常是将具有较低数据类型优先级的操作数隐式地转换为具有较高优先级的类型。在这个例子中,是把字符串文字转换成了列具有的数据类型(DATETIME),因为SQL Server认为字符串的数据类型优先级比日期和时间数据类型的要低。隐式转换规则也不总是这么简单,其实在过滤条件和其他表达式中应用的规则是不同的。不过,出于我们讨论的目的,现在尽可能先让事情简单些。有关数据类型优先级的完整列表,请参阅SQL Server联机丛书的“数据类型优先级”一节。

  这里须要澄清的一点是,在前面的例子中,隐式转换是在幕后进行的。前面的查询在逻辑上等于以下查询(显示地将字符串转换为DATETIME数据类型):

1 SELECTorderid,custid,empid,orderdate
2 FROMSales.Orders
3 WHEREorderdate =CAST('20070212'ASDATETIME);

  要重点注意一些日期和时间常量字符串是与语言相关的,也就是说当把它们转换成日期和时间类型时,根据当前会话中有效的语言设置,SQL Server对它们解释的方法也可能会有所不同。DBA定义的每个登录都有一个与之关联的默认语言,除非显示地修改,这一语言将一直是会话中的有效语言。可以使用SET LANGUAGE命令改写会话中的默认语言,但一般不推荐这么做,因为代码中的某些地方可能会依赖用户的默认语言。

  会话中的有效语言将会在后台影响几个与语言相关的设置,其中有一个称为DATEFORMAT的设置,它会决定当把字符串类型转换成日期和时间类型时,SQL Server如何解释输入的字符串常量。DATEFORMAT设置是由字符d、m,以及y的组合来表示的。例如,us_english语言设计会把DATEFORMAT设置为mdy,而British语言设置则将DATEFORMAT设置为dmy。可以用SET DATEFORMAT命令改写会话中的DATEFORMAT设置,但如前面所述,通常不推荐对语言相关的设置进行修改。例如,考虑字符串文字'02/12/2007'。当把这个字符串文字转换成DATETIME、DATE、DATETIME2或DATETIMEOFFSET这些类型时,SQL Server可以将数据解释为2007年2月12日,也可以解释为2007年12月2日。这时,有效的LANGUAGE/DATEFORMAT设置就是决定因素。为了演示对相同字符串文字的不同解释转换,请运行以下代码:

1 SETLANGUAGE British;
2 SELECTCAST('02/12/2007'ASDATETIME);
3
4 SETLANGUAGE us_english;
5 SELECTCAST('02/12/2007'ASDATETIME);

  注意它们的输出,在两种不同的语言环境中,字符串文字的解释也各不相同:

  注意,LANGUAGE/DATEFORMAT只会影响输入值的解释方式,对数据输出中使用的格式没有任何影响。输出格式是由客户端工具(如OLEBD)使用的数据库接口决定的,而不是由LANGUAGE/DATEFORMAT设置决定的。例如,OLEDB和ODBC都是按照'YYYY-MM-DD hh:mm:ss.nnn'的格式来表示DATETIME值。

  因为你写的代码可能最终要交付给国际用户使用,而他们登录用的语言设置也各不相同;所以,理解一些日期和时间的字符串文字是语言独立的,就显得尤为重要。强烈建议按照语言无关的方式来编写日期和时间字符串文字。对于语言无关的格式,SQL Server总能以相同的方式加以解释,而不受语言相关设置的影响。下表列出了每种日期和时间类型的语言无关的字符串文字格式。

数据类型

语言中立的格式

推荐格式及示例

DATETIME

YYYYMMDD hh:mm:ss.nnn

YYYY-MM-DDThh:mm:ss.nnn

YYYYMMDD

20090212 12:30:15.123

2009-02-12T12:30:15.123

20090212

SMALLDATETIME

YYYYMMDD hh:mm

YYYY-MM-DDThh:mm

YYYYMMDD

20090212 12:30

2009-02-12T12:30

20090212

DATE

YYYYMMDD

YYYY-MM-DD

20090212

2009-02-12

DATETIME2

YYYYMMDD hh:mm:ss.nnnnnnn

YYYY-MM-DD hh:mm:ss.nnnnnnn

YYYY-MM-DDThh:mm:ss.nnnnnnn

YYYYMMDD

YYYY-MM-DD

20090212 12:30:15.1234567

2009-02-12 12:30:15.1234567

2009-02-12T12:30:15.1234567

20090212

2009-02-12

DATETIMEOFFSET

YYYYMMDD hh:mm:ss.nnnnnnn [+|-]hh:mm

YYYY-MM-DD hh:mm:ss.nnnnnnn [+|-]hh:mm

YYYYMMDD

YYYY-MM-DD

20090212 12:30:15.1234567 +02:00

2009-02-12 12:30:15.1234567 +02:00

20090212

2009-02-12

TIME

hh:mm:ss.nnnnnnn

12:30:15.1234567

  上表中有两点要注意。对于所有包括日期和时间组成部分的类型,如果不在字符串文字中指定时间,则SQL Server默认将时间设置为午夜。如果不指定时区,SQL Server将采用00:00。此外,也要重点注意'YYYY-MM-DD'和'YYYY-MM-DD hh:mm...'格式,当转换到DATETIME或SMALLDATETIME类型时,它们是语言相关的;当转换到DATE、DATETIME2,以及DATETIMEOFFSET时,它们是语言无关的。

  例如,注意在以下代码中,语言设置对于以'YYYYMMDD'格式表示的字符串文字如何转换为DATETIME类型的数据并没有影响:

1 SETLANGUAGE British;
2 SELECTCAST('20070212'ASDATETIME);
3
4 SETLANGUAGE us_english;
5 SELECTCAST('20070212'ASDATETIME);

  输出结果表明,两种情况下的字符串文字都被转换成2007年2月12日的日期:

  优先使用类似'YYYYMMDD'这样语言无关的格式是一条最佳实践原则,再怎么强调这一点也不为过。因为无论LANGUAGE/DATEFORMAT如何设置,SQL Server对这些格式的解释都是相同的。

  如果你坚持要用与语言相关的格式来表示日期和时间字符串文字,则可以使用CONVERT函数,在它的第3个参数中指定一个表示正在使用的样式的数字,显示地将字符串文字转换成想要的数据类型。SQL Server联机文档在“CAST和CONVERT函数”一节用一个表格列举出了所有的样式数字和它们各种代表的格式。例如,如果想指定字符串文字'02/12/2007'的格式为mm/dd/yyyy,则可以使用样式号101,如下所示:

1 SELECTCONVERT(DATETIME,'02/12/2007',101);

  这样,不论当前会话有效的语言设置是什么,SQL Server都会把该字符串文字解释为2007年2月12日。

  如果想采用dd/mm/yyyy的格式,可以选用样式号103:

1 SELECTCONVERT(DATETIME,'02/12/2007',103);

  这次字符串文字将被解释为2007年12月2日。

转载于:https://www.cnblogs.com/ShaYeBlog/archive/2012/09/25/2701325.html

处理日期和时间数据--字符串文字相关推荐

  1. pandas使用strftime函数将dataframe的日期格式数据列按照指定格式(format)转化为日期(时间)字符串数据列

    pandas使用strftime函数将dataframe的日期格式数据列按照指定格式(format)转化为日期(时间)字符串数据列 目录

  2. C语言如何返回格式化日期时间(格式化时间)?(将日期和时间以字符串格式输出)ctime()、asctime()、localtime()、strftime()

    文章目录 ctime()函数: asctime()函数 获取自定义格式化时间(有bug,当时间为个位数时,没有在前面自动补零) 改成函数接口形式(传入字符指针) 20220107 优化后(能自动补零) ...

  3. python字符串转日期_python 日期、时间、字符串相互转换

    python 日期.时间.字符串相互转换 在python中,日期类型date和日期时间类型dateTime是不能比较的. (1)如果要比较,可以将dateTime转换为date,date不能直接转换为 ...

  4. SQL Server 数据类型(整数、浮点数据、日期与时间数据、文本和图形数据类型、货币数据类型、位数据类型、二进制数据类型)

    数据类型: 每个属性来自一个域,他的取值必须是域中的值.在SQL中域的概念用数据类型来实现,定义表的各个属性时需要指明其数据类型及长度. 一:系统数据类型       Sql Server 提供的系统 ...

  5. c语言中把时间拷到字符串中,C语言中将日期和时间以字符串格式输出的方法

    ctime()函数:头文件: #include 定义函数: char *ctime(const time_t *timep); 函数说明:ctime()将参数timep 所指的time_t 结构中的信 ...

  6. python读取excel日期和时间数据_python 在excel文件中写入date日期数据,以及读取excel日期数据,如何在python中正确显示date日期。...

    如何通过python写入date数据了? 写入还是很简单的. import xlwt3 import  datetime as dt workbook = xlwt.Workbook() worksh ...

  7. php极客时间,PHP日期与时间

    日期与时间是一种比较复杂的组合型数据,各种环境下的处理方式并不完全一致:本节,我们就了解一些在PHP中处理日期与时间的函数,并对一些常用代码进行封装. time().mktime()与checkdat ...

  8. 关于Java中的日期与时间的相关类说明详解

    文章目录 1.关于Java元年与时间戳 2.关于Date类 2.1常用API代码展示 3.关于Calendar类 3.1获取Calendar对象 3.2创建自定义的Calendar对象 3.2Cale ...

  9. Java日期和时间JDK—API1.6.0(Date类、Calendar类)

    java.util,Date Java在java.util包中提供了Date类,这个类封装了当前的日期和时间: 所有已经实现的接口:Serializable         Cloneable    ...

  10. 如何向 Oracle 表中的 Date 字段插入日期及时间

    如何向 Oracle 表中的 Date 字段插入日期及时间  Oracle中与sqlserver 插入日期型数据时,有比较大的区别.sqlserver中,直接把日期型数据用单引号括起来就可以,而Ora ...

最新文章

  1. [BZOJ] 1911 [Apio2010]特别行动队
  2. 大话RxJava:一、初识RxJava与基本运用
  3. 10012 - How Big Is It?
  4. 手机linux编译器,在linux上交叉编译helloWorld到android手机上去
  5. 三大主流开源工作流引擎技术分析与市场预测
  6. Monotonic Renumeration
  7. boost::test模块带有自定义初始化测试的静态库使用变体
  8. oracle 树状结构一直出现不了_深入解析Oracle ASSM 段头块(PAGETABLE SEGMENT HEADER)结构...
  9. java捕捉了异常_java 异常捕获与异常处理
  10. System.Net.Cookie
  11. 如何在Telegram机器人中设置推送通知
  12. oraclr 和mysql的不同_Mysql和Oracle中的不同
  13. 【Flink】ERROR - Exception occurred in REST handler: Job xxx not found
  14. Nginx启动报错误unlink() “nginx.pid” failed (2: No such file or directory)
  15. java 复写hashcode_java 重写equals()和hashCode()
  16. 以CCF CSP认证为抓手,积极探索软件基础能力递进式培养体系
  17. 大学生python作业代做_代写COMP9021作业、代做Python编程语言作业、代写Python实验作业、代做program留学生作业...
  18. html中3d图片轮播图,js实现图片3D轮播效果
  19. Windows10当中的混合现实门户怎么使用 超详细讲解 win10混合现实门户怎么用?
  20. 微信分享图片URL不显示问题

热门文章

  1. [jQuery] 速记一の屏蔽鼠标右键监听鼠标Event
  2. Error:Could not launch XXX failed to get the task for process 1105
  3. C#高级编程之C#基础知识
  4. 虚拟机Linux(Centos)上用户密码忘记了怎么办?
  5. mysql中int 5_mysql中int(x)与int以及varchar与char的区别_HelloWorld_ty的博客-CSDN博客
  6. 计算器计算经纬距离_造价人如何熟练运用计算器来做题?
  7. 遍历系统进程和对应模块以及创建进程
  8. Linux 服务器之间文件传输
  9. springcloud断点续传源码_SpringCloud 超大文件上传和断点续传的实现
  10. 【渝粤教育】 广东开放大学21秋期末考试法律文书10684k2